Python readlines () i efektywna praktyka czytania
Mam problem z analizowaniem 1000 plików tekstowych (około 3000 linii w każdym pliku o rozmiarze ~ 400 KB) w folderze. Przeczytałem je za pomocą readlines,
for filename in os.listdir (input_dir) :
if filename.endswith(".gz"):
f = gzip.open(file, 'rb')
else:
f = open(file, 'rb')
file_content = f.readlines()
f.close()
len_file = len(file_content)
while i < len_file:
line = file_content[i].split(delimiter)
... my logic ...
i += 1
Działa to całkowicie dobrze dla próbki z moich wejść (50, 100 plików). Gdy pobiegłem na całym wejściu więcej niż 5K plików, czas ten nie był bliski przyrostowi liniowemu. Planowałem przeprowadzić analizę wydajności i wykonać analizę Cprofile. Czas potrzebny na to, aby więcej plików wzrastało wykładniczo, osiągając niższe wskaźniki, gdy dane wejściowe sięgały plików 7K.
Oto skumulowany czas potrzebny na linie, najpierw -> 354 pliki (próbka z wejścia) i drugi -> 7473 pliki (całe wejście)
ncalls tottime percall cumtime percall filename:lineno(function)
354 0.192 0.001 **0.192** 0.001 {method 'readlines' of 'file' objects}
7473 1329.380 0.178 **1329.380** 0.178 {method 'readlines' of 'file' objects}
Z tego powodu czas potrzebny na mój kod nie jest skalowany liniowo wraz ze wzrostem wejścia. Przeczytałem kilka notatek na ten tematreadlines()
, gdzie ludzie twierdzą, że toreadlines()
wczytuje całą zawartość pliku do pamięci, a zatem generalnie zużywa więcej pamięci niżreadline()
lubread()
.
Zgadzam się z tym punktem, ale czy garbage collector automatycznie czyści załadowaną zawartość z pamięci na końcu mojej pętli, stąd w każdej chwili moja pamięć powinna mieć tylko zawartość mojego aktualnie przetwarzanego pliku? Ale jest tu jakiś haczyk. Czy ktoś może dać wgląd w ten problem.
Czy jest to wrodzone zachowaniereadlines()
lub moja zła interpretacja oczyszczacza śmieci Pythona. Dobrze wiedzieć.
Zasugeruj także alternatywne sposoby robienia tego samego w sposób efektywny pamięciowo i czasowo. TIA.