Abbiamo bisogno di leggere e contare diversi tipi di messaggi/eseguire alcune statistiche su un file di testo da 10 GB, ad esempio un FIX motore log. Usiamo Linux, 32 bit, 4 CPU, Intel, la codifica in Perl ma la lingua non ha molta importanza.Qual è il modo più veloce per leggere il file da 10 GB dal disco?
Ho trovato alcuni suggerimenti interessanti in di Tim Bray WideFinder project. Tuttavia, abbiamo scoperto che l'uso della mappatura della memoria è intrinsecamente limitato dall'architettura a 32 bit.
Abbiamo provato a utilizzare più processi, che sembra funzionare più velocemente se elaboriamo il file in parallelo utilizzando 4 processi su 4 CPU. L'aggiunta di multi-threading lo rallenta, forse a causa del costo del cambio di contesto. Abbiamo provato a cambiare la dimensione del pool di thread, ma è ancora più lenta della versione semplice multiprocedel .
La parte mappatura della memoria non è molto stabile, a volte prende 80 sec e, talvolta, 7 sec su un file di 2 GB, forse da errori di pagina o qualcosa legato a utilizzo della memoria virtuale. In ogni caso, Mmap non può scalare oltre i 4 GB su un'architettura a 32 bit.
Abbiamo provato Perl's IPC::Mmap e Sys::Mmap. Sembrava anche in Map-Reduce, ma il problema è in realtà legato all'I/O , l'elaborazione stessa è sufficientemente veloce.
così abbiamo deciso di provare a ottimizzare la base di I/O sintonizzando dimensione buffer, tipo, ecc
Can chiunque sia a conoscenza di un progetto esistente in cui questo problema è stato risolto in modo efficiente in qualsiasi lingua/piattaforma puntare a un link utile o suggerire una direzione?
Qual è la prestazione non elaborata su una singola CPU per 2G? Probabilmente è necessario determinare se l'I/O è il problema oi calcoli della CPU. – Cervo
Se sei realmente legato al disco (IO), l'approccio migliore è probabilmente quello di acquistare dischi più veloci, più dischi (in RAID0, RAID5, RAID10, ecc.) O una macchina a 64 bit con sufficiente memoria per archiviare il file un disco RAM. Qualsiasi disco singolo ragionevole dovrebbe essere in grado di tirare 50 MB/sec; più dischi veloci dovrebbero essere in grado di spingerti ad almeno 300MB/sec. – derobert
Ti consiglio di non utilizzare Sys :: Mmap ma File-Map (per i motivi indicati nella documentazione di quest'ultimo). In ogni caso probabilmente non si desidera utilizzare IPC :: Mmap. –