2012-05-05 22 views
7

W tej chwili piszę trochę kodu Pythona, aby poradzić sobie z ogromnymi plikami twitter. Te pliki są tak duże, że nie mieszczą się w pamięci. Aby z nimi pracować, mam w zasadzie dwie możliwości.Efektywność czytania linii po linii w Pythonie

  1. Mogę podzielić pliki na mniejsze pliki, które zmieszczą się w pamięci.

  2. Mogłem przetworzyć duży plik wiersz po wierszu, więc nigdy nie muszę dopasowywać całego pliku do pamięci naraz. Wolałbym to drugie ze względu na łatwość wdrożenia.

Zastanawiam się jednak, czy szybciej jest odczytać w całym pliku do pamięci, a następnie manipulować nim stamtąd. Wydaje się, że powolne byłoby ciągłe czytanie pliku po linii z dysku. Ale znowu nie w pełni rozumiem, jak te procesy działają w Pythonie. Czy ktoś wie, czy odczytanie linii po linii spowoduje, że mój kod będzie wolniejszy, niż gdybym przeczytał cały plik w pamięci i po prostu nim manipulował?

+0

Dlaczego nie spróbować czytać wiersz po linii i zobaczyć? Jeśli ci się uda, to jest świetne i nie jest tak, że zmiana go będzie trudna. –

+1

to zawsze zależy od tego, jak masywny jest "masywny". – Shep

+0

Miejmy nadzieję, że przydatna odpowiedź: http://stackoverflow.com/a/8717312/416626 – urschrei

Odpowiedz

9

Aby naprawdę szybko odczytać plik, spójrz na moduł mmap. Spowoduje to, że cały plik pojawi się jako duża porcja pamięci wirtualnej, nawet jeśli jest znacznie większa niż dostępna pamięć RAM. Jeśli twój plik jest większy niż 3 lub 4 gigabajty, będziesz chciał użyć 64-bitowego systemu operacyjnego (i 64-bitowej wersji Pythona).

Zrobiłem to dla plików o wielkości powyżej 30 GB z dobrymi wynikami.

1

Jeśli chcesz przetworzyć pliku wiersz po wierszu, można po prostu użyć obiektu pliku jako iterator:

for line in open('file', 'r'): 
    print line 

Ta pamięć jest bardzo wydajny; jeśli chcesz pracować na partii linii naraz, możesz również użyć metody obiektu readlines() z parametrem sizehint. To czyta w bajtach sizehint plus wystarczającą liczbę bajtów, aby uzupełnić ostatnią linię.

Powiązane problemy