2017-01-30 10 views
6

Sprawdziłem this, this i this.Python - odczytanie 1000 wierszy z pliku na raz

Trzecie łącze wydawało się mieć odpowiedź, ale nie wykonało zadania.

Nie mogę znaleźć rozwiązania, w którym cały plik zostanie przeniesiony do głównej pamięci, ponieważ pliki, z którymi będę pracował będą bardzo duże. Dlatego zdecydowałem się użyć islice, jak pokazano w trzecim linku. Pierwsze 2 linki były nieistotne, ponieważ wykorzystywały je tylko w 2 liniach lub odczytały 1000 znaków. Podczas gdy potrzebuję 1000 linii.for now N is 1000

Mój plik zawiera linie:

Próbka:

1 1 1 
1 2 1 
1 3 1 
1 4 1 
1 5 1 
1 6 1 
1 7 1 
1 8 1 
1 9 1 
1 10 1 

Więc jeśli czytam 1000 linii na raz, muszę przejść przez while1000 razy , ale kiedy wydrukuję p, aby sprawdzić, ile razy byłem w stanie, to nie zatrzyma się na 1000 . Po uruchomieniu mojego programu na 19038838 osiągnąłem 1400 sekund !!

KOD:

def _parse(pathToFile, N, alg): 
    p = 1 
    with open(pathToFile) as f: 
     while True: 
      myList = [] 
      next_N_lines = islice(f, N) 
      if not next_N_lines: 
       break 
      for line in next_N_lines: 
       s = line.split() 
       x, y, w = [int(v) for v in s] 
       obj = CoresetPoint(x, y) 
       Wobj = CoresetWeightedPoint(obj, w) 
       myList.append(Wobj) 
      a = CoresetPoints(myList) 
      client.compressPoints(a) // This line is not the problem 
      print(p) 
      p = p+1 
    c = client.getTotalCoreset() 
    return c 

Co robię źle?

+1

Opcja 'f' prawdopodobnie nie zużytą więc skończyć się czyta te same i same linie za każdym razem 1000 . To się nigdy nie skończy. Musisz użyć alternatywnego sformułowania dla 'islice' (' itertools.islice (iterable, start, stop [, step]) 'this a nie' itertools.islice (iterable, stop) 'this) –

Odpowiedz

5

As @ Ev.kounis powiedział, że pętla while nie działa poprawnie.

Polecam, aby przejść do funkcji plastyczności na fragmencie danych w takim momencie:

def get_line(): 
    with open('your file') as file: 
     for i in file: 
      yield i 

lines_required = 1000 
gen = get_line() 
chunk = [next(gen) for i in range(lines_required)] 
+0

Ale czy nie będzie spróbuj otworzyć ten sam plik '1M' razy dla każdej linii? spowolni to program, prawda? –

+2

Nie, będzie tylko powtarzać kroki w pętli for. Wydajność może być interpretowana jako "zwróć to wejście i wróć tutaj dokładnie tutaj, gdy zostaniesz o to poproszony". Zobacz dokumentację dla Generatorów: https://docs.python.org/3/howto/functional.html#generators – MKesper

+0

@MKesper A jak to się stanie, jeśli plik się skończy, żebym mógł przestać iterować i czytać? 'if not chunk: break' nie działało. Jakieś pomysły ? –