Tengo un archivo ASCII donde cada línea contiene un registro de longitud variable. Por ejemplolectura y escritura en fragmentos en Linux usando c
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters
Como el tamaño de los archivos es de aproximadamente 10 GB, me gustaría leer el registro en trozos. Una vez leído, necesito transformarlos, escribirlos en otro archivo en formato binario.
Por lo tanto, para la lectura, mi primera reacción fue la de crear una matriz de caracteres tales como
FILE *stream;
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
- ¿Es correcto asumir que Linux emitirá una llamada al sistema a buscar todo el 100MB?
- Como los registros están separados por una nueva línea, busco carácter por carácter para un nuevo carácter de línea en el búfer y reconstruyo cada registro.
Mi pregunta es, ¿esta es la forma en que debería leer en trozos o hay una mejor alternativa para leer datos en trozos y reconstituir cada registro? ¿Hay una forma alternativa de leer x número de líneas de tamaño variable desde un archivo ASCII en una sola llamada?
Siguiente durante la escritura, hago lo mismo. Tengo un buffer de escritura de char, que paso a fwrite para escribir un conjunto completo de registros en una llamada.
fwrite(buffer, sizeof(buffer), 104857600, stream);
ACTUALIZACIÓN: Si i setbuf (corriente, tampón), donde búfer es mi char buffer de 100MB, sería FGETS regreso de búfer o hacer que un disco IO?
Buscar en los datos, obtendrá una línea por vez si lo desea. –
Me gustaría evitar leer línea por línea, pero preferiría leer X líneas de tamaño variable en una sola toma. Además, con fgets(), tendría que tener un búfer en el que la línea más larga podría caber. Como mi tamaño de registro puede variar de unos 100 bytes a 16 MB, estaría desperdiciando memoria. – Jimm