Ho un file ASCII in cui ogni riga contiene un record di lunghezza variabile. Ad esempiolettura e scrittura in blocchi su linux utilizzando c
Record-1:15 characters
Record-2:200 characters
Record-3:500 characters
...
...
Record-n: X characters
Poiché le dimensioni del file sono circa 10 GB, vorrei leggere il record in blocchi. Una volta letti, ho bisogno di trasformarli, scriverli in un altro file in formato binario.
Così, per la lettura, la mia prima reazione è stata di creare un array di caratteri, come
FILE *stream;
char buffer[104857600]; //100 MB char array
fread(buffer, sizeof(buffer), 104857600, stream);
- È corretto presumere, che Linux emetterà una chiamata di sistema e recuperare l'intero 100MB?
- Poiché i record sono separati da una nuova riga, cerco carattere per carattere per un nuovo carattere di linea nel buffer e ricostruisco ciascun record.
La mia domanda è che è così che dovrei leggere in blocchi o c'è un'alternativa migliore per leggere i dati in blocchi e ricostituire ogni record? C'è un modo alternativo per leggere il numero x di linee di dimensioni variabili da un file ASCII in una chiamata?
Avanti durante la scrittura, faccio lo stesso. Ho un buffer char di scrittura, che passo a fwrite per scrivere un intero set di record in una sola chiamata.
fwrite(buffer, sizeof(buffer), 104857600, stream);
UPDATE: Se i setbuf (flusso, buffer), dove buffer è il mio char buffer di 100 MB, sarebbe fgets ritorno dal buffer o causare un disco IO?
Cerca in fget, otterrà una riga alla volta per te se desideri. –
Vorrei evitare di leggere riga per riga, ma preferirei leggere linee X di dimensioni variabili in un colpo solo. Inoltre, con fgets(), avrei bisogno di un buffer nel quale si inserisse la riga più lunga. Poiché le dimensioni del mio record possono variare da pochi 100 byte a 16 MB, perderei memoria. – Jimm