Necesitamos leer y contar diferentes tipos de mensajes/ejecutar algunas estadísticas en un archivo de texto de 10 GB, por ejemplo, un FIX motor log. Usamos Linux, 32 bits, 4 CPUs, Intel, codificación en Perl pero , el lenguaje en realidad no importa.¿Cuál es la manera más rápida de leer un archivo de 10 GB del disco?
He encontrado algunos consejos interesantes en Tim Bray's WideFinder project. Sin embargo, hemos encontrado que el uso de la asignación de memoria está intrínsecamente limitado por la arquitectura de 32 bits.
Intentamos usar procesos múltiples, lo que parece funcionar más rápido si procesamos el archivo en paralelo usando 4 procesos en 4 CPUs. Agregar múltiples subprocesos lo ralentiza, tal vez debido al costo del cambio de contexto. Intentamos cambiar el tamaño del grupo de subprocesos, pero aún es más lento que versión multiproceso simple.
La parte de asignación de memoria no es muy estable, a veces toma 80 segundos y, a veces 7 segundos en un archivo de 2 GB, tal vez de errores de página o algo relacionado con el uso de la memoria virtual. De todos modos, Mmap no puede escalar más allá de 4 GB en una arquitectura de 32 bit .
Probamos Perl's IPC::Mmap y Sys::Mmap. Miró en Map-Reduce también, pero el problema es realmente E/S obligado, el procesamiento en sí es lo suficientemente rápido.
así que decidimos tratar de optimizar la E/S básica sintonizando tamaño de búfer, tipo, etc.
Puede cualquier persona que tenga conocimiento de un proyecto existente en este problema fue resuelto de manera eficiente en cualquier lenguaje/plataforma apuntan a un enlace útil o sugieren una dirección?
¿Cuál es el rendimiento bruto en una sola CPU para 2G? Probablemente necesite determinar si la E/S es el problema o los cálculos de la CPU. – Cervo
Si realmente está vinculado al disco (IO), entonces la mejor opción es comprar discos más rápidos, más discos (en RAID0, RAID5, RAID10, etc.) o una máquina de 64 bits con memoria suficiente para almacenar el archivo en un disco RAM Cualquier disco único razonable debería ser capaz de extraer 50MB/seg; múltiples discos rápidos deberían poder empujarlo a por lo menos 300MB/seg. – derobert
Te recomiendo que no uses Sys :: Mmap sino File-Map (por los motivos que se indican en la documentación de este último). En cualquier caso, probablemente no desee usar IPC :: Mmap. –