Musimy odczytywać i liczyć różne typy wiadomości/uruchomić niektóre statystyki na pliku tekstowym 10 GB, np. FIX silnik log. Używamy Linuksa, 32-bit, 4 procesory, Intel, kodowanie w Perlu, ale język nie ma znaczenia.Jaki jest najszybszy sposób na odczytanie pliku 10 GB z dysku?
Znalazłem kilka ciekawych wskazówek w Tim Bray: WideFinder project. Odkryliśmy jednak, że używanie mapowania pamięci jest z natury ograniczone przez 32-bitową architekturę.
Próbowaliśmy użyć wielu procesów, które wydają się działać szybciej, jeśli przetwarzamy plik równolegle przy użyciu 4 procesów na 4 procesorach. Dodanie wielowątkowości spowalnia ją, być może ze względu na koszt przełączania kontekstów. Próbowaliśmy zmienić rozmiar puli wątków, ale jest to nadal wolniejsza niż prosta wersja wieloprocesorowa.
Część odwzorowania pamięci nie jest bardzo stabilna, czasami jest to trwa 80 sekund, a czasem 7 sekund na pliku 2 GB, może z błędów stron lub czegoś związanego z wykorzystaniem pamięci wirtualnej. W każdym razie, Mmap nie może przeskalować poza 4 GB w 32-bitowej architekturze .
Próbowaliśmy Perla IPC::Mmap i Sys::Mmap. Wygląda na to, że również na Map-Reduce, ale problem jest naprawdę I/O związany, samo przetwarzanie jest wystarczająco szybkie.
Więc zdecydowaliśmy się spróbować zoptymalizować podstawowe I/O przez strojenie rozmiar buforowania, typ itp
Czy ktoś, kto zdaje sobie sprawę z istniejącego projektu, gdzie ten problem został skutecznie rozwiązać w dowolnym języku/platformy wskaż przydatne łącze lub zaproponuj kierunek?
Co to jest surowa wydajność pojedynczego procesora dla 2G? Prawdopodobnie musisz określić, czy I/O to problem, czy obliczenia procesora. – Cervo
Jeśli jesteś naprawdę związany z dyskiem (IO), najlepszym rozwiązaniem jest prawdopodobnie kupowanie szybszych dysków, więcej dysków (w RAID0, RAID5, RAID10 itd.) Lub 64-bitowej maszyny z wystarczającą pamięcią do przechowywania pliku dysk RAM. Każdy rozsądny pojedynczy dysk powinien być w stanie pobrać 50 MB/s; wiele szybkich dysków powinno być w stanie popchnąć użytkownika do co najmniej 300 MB/s. – derobert
Zalecam, aby nie używać Sys :: Mmap, ale Mapa plików (z powodów podanych w dokumentacji tego ostatniego). W każdym razie prawdopodobnie nie chcesz używać IPC :: Mmap. –