Tengo que lidiar con archivos de texto muy grandes (2 GB), es obligatorio leerlos/escribirlos línea por línea. Escribir 23 millones de líneas utilizando ofstream es muy lento, así que, al principio, traté de acelerar el proceso escribiendo grandes trozos de líneas en un búfer de memoria (por ejemplo, 256 MB o 512 MB) y luego escribí el búfer en el archivo . Esto no funcionó, el rendimiento es más o menos el mismo. Tengo el mismo problema al leer los archivos. Sé que las operaciones de E/S están protegidas por el sistema de E/S STL y esto también depende de la política del programador del disco (administrada por el sistema operativo, en mi caso, Linux).¿Cuándo construir su propio sistema de almacenamiento intermedio para E/S (C++)?
¿Alguna idea sobre cómo mejorar el rendimiento?
PD: He estado pensando en utilizar un proceso hijo de fondo (o un hilo) para leer/escribir los fragmentos de datos mientras el programa está procesando datos pero no sé (principalmente en el caso del subproceso) si esto será digno
Ver esta respuesta para leer desde una archivo directamente en el búfer de cadena de caracteres: http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream#138645 –
No mencionó qué velocidades está viendo. Según las unidades físicas, no espere que las escrituras sostenidas excedan mucho más de 40-60 MB/s. Use dd para comparar el rendimiento de la escritura. Utilice unidades seccionadas (como RAID 0, RAID 1 + 0) para aumentar el rendimiento (hasta ~ 4 unidades antes de que el bus cierre). –