2011-10-10 13 views
5

Czy zauważalna różnica (teoretycznie) przy odczycie linii po wierszu w porównaniu do odczytu całego pliku za jednym razem?Wydajność przy odczytywaniu pliku wiersz po wierszu vs czytanie całego pliku

Czytanie całego pliku ma negatywny wpływ na ilość wykorzystanej pamięci, ale czy działa szybciej?

Potrzebuję przeczytać plik i przetworzyć każdy wiersz. Nie wiem, czy powinienem czytać po jednej linii na raz i przetwarzać ją, czy czytać cały plik, przetwarzać wszystkie, a następnie pisać na wyjściu.

Już skonfigurowałem prgm do czytania linia po linii i chcę się dowiedzieć, czy warto podjąć wysiłek, aby zmienić go na odczyt całego pliku (nie jest to łatwe z uwagi na moją konfigurację).

Dzięki,

+1

Teoretycznie napęd będzie musiał częściej wyszukiwać i czytać w programie liniowym, w zależności od tego, co jeszcze się dzieje. W praktyce może to nie stanowić problemu, ponieważ buforowane pliki i/o są prawdopodobnie używane do odczytu w większych blokach. Twój przebieg będzie się różnić w zależności od szczegółów twojego sprzętu i twojego algorytmu. Podczas optymalizacji należy spodziewać się wielokrotnych iteracji programu i dodać kod timera lub użyć profilera, aby dowiedzieć się, co zajmuje najwięcej czasu. – holtavolt

Odpowiedz

0

szczerze mówiąc, po przestudiowaniu efektywności na chwilę podczas mojego stopnia, doszedłem do wniosku, o to pytanie: to zależy, jak często ten plik ma być odczytany. Jeśli czytasz go raz, to zrób to, bo to po prostu zwolni proces dla innych zadań. Jeszcze jedną rzeczą, o której warto pamiętać, jest to, że plik zostanie poddany późniejszej edycji i będzie wymagał aktualizacji (jak w przypadku przeczytania tylko zaktualizowanej części?), Jeśli tak, być może trzeba będzie ustawić znacznik, aby ponownie rozpoznać miejsce odczytywania (a następnie jeszcze raz, jak często jest aktualizowany?). Ale tak, jeśli jest to jednorazowa praca, śmiało i przeczytaj ją jako całość, o ile nie musisz tworzyć żadnych żetonów określonych literałów w pliku. mam nadzieję, że to pomoże.

+0

W każdym nowoczesnym systemie operacyjnym * nix lub Windows tego typu rzeczy (buforowanie, współdzielenie procesów, oznaczanie aktualizacji) są wykonywane przez system operacyjny. –

+0

Zgadzam się ... czasami, gdy ludzie traktują efektywność zbyt poważnie, faktycznie to pogarszają! polega to na implementowaniu/zakłócaniu buforowania, współdzieleniu procesów, oznaczaniu aktualizacji. –

0

Czytanie całego pliku w pamięci nie jest dobrym pomysłem, ponieważ pliki mogą być ogromne i mogą zająć dużo pamięci, aw najgorszym przypadku zabraknie jej pamięci. Aby zrównoważyć wydajność i zużycie pamięci, należy odczytać blok pliku w buforze i przeanalizować bufor. Po zakończeniu przetwarzania bloku przeczytaj następny blok do EOF.

Decydując się na dobry rozmiar bloku, należy wykonać na podstawie tego, co chcesz osiągnąć.

+1

System plików zrobi to wszystko "blokując" dla ciebie! Nazywane zarządzaniem buforami, implementacja własnego buforowania na górze bufora systemu operacyjnego spowolni Cię. –

+0

@ James Anderson - Masz rację :) Właśnie zrobiłem to na wyłączność jako OP wspomniany "w teorii". – srikanta

2

Czytanie całego pliku będzie nieco szybsze - ale niewiele!

Należy jednak uważać, aby cały plik nie był skalowalny, ponieważ ogranicza go pamięć dostępna w systemie, gdy rozmiar pliku przekroczy rozmiar pamięci RAM do programu, który rozpocznie korzystanie z przestrzeni wymiany, będzie znacznie wolniejszy. Jeśli rozmiar pliku przekracza rozmiar dostępnej pamięci wirtualnej, program ulegnie awarii.

0

Jednym z czynników jest ilość danych, które zamierzasz odczytać, a więc ile czasu zajmuje uruchomienie programu, tzn. Czy przy pracy nad wydajnością występuje jakaś korzyść.

Zobacz cytaty z książki w this answer, aby uzyskać dobre, ogólne porady dotyczące myślenia o wydajności oprogramowania.

(wiem, że jesteś na odpowiedź w teorii, ale ten aspekt podczas martwić się o wydajność jest również ważne, gdy masz ograniczoną ilość czasu, aby wydać.)

1

Podobnie jak inni, Wierzę, że robienie większych odczytów poprawi wydajność niektórych aplikacji, ale nie oczekuj cudów, I/O jest już buforowane w warstwie systemu operacyjnego, więc zyskasz tylko dzięki zmniejszeniu obciążenia związanego z zbyt dużą ilością odczytanych połączeń. Czytanie całego pliku za jednym razem jest niebezpieczne, chyba że znasz maksymalny możliwy rozmiar plików wejściowych. Najbardziej rozsądnym podejściem jest odczytanie pliku w dużych blokach.

Jeśli chcesz poprawić jeszcze bardziej, powinieneś rozważyć nakładanie się operacji we/wy z przetwarzaniem. Powiedzmy, że czytasz plik wejściowy w blokach o wielkości 128 MB. W głównym wątku czytasz pierwszy blok 128 MB, a następnie przekazujesz go do wątku roboczego w celu przetworzenia. Podczas gdy wątek roboczy zaczyna działać, główny wątek odczytuje drugi blok 128 MB. Od tej chwili, gdy wątek roboczy przetwarza blok N, głównym wątkiem jest odczyt bloku N + 1 z dysku.

0

Myślę, że to zależy od potrzeb Twojej aplikacji (jak większość rzeczy, wiem). Odczytanie pliku 1 MB w węźle Node js jest ~ 3-4x szybsze z fs.readFile() niż używanie czytelnego strumienia lub czytnika linii, o ile tylko odczytuje plik. Strumienie mogą oferować dodatkową wydajność, jeśli plik jest bardzo duży i przetwarzasz dane wejściowe w locie. Może to być również idealne, jeśli twoja aplikacja zużywa już dużo pamięci, ponieważ proces Node ma ograniczenie pamięci ~ 1,5 GB w 64-bitowych systemach. Przetwarzanie fragmentów w miarę ich pojawiania się może być bardziej wydajne, jeśli źródło danych jest wolne w stosunku do szybkości, z jaką procesor może je przetwarzać (archiwa na dysku twardym lub taśmie, połączenia sieciowe, takie jak TCP). Jeśli chodzi o odczytywanie pliku do pamięci i przesyłanie go do pamięci, to zgaduję, że wywołanie funkcji wywoływania zdarzeń danych i przejście do funkcji wywołania funkcji przetwarzania spowalnia proces.

Powiązane problemy