Il modo più veloce per creare file di grandi dimensioni in c ++?
-
06-07-2019 - |
Domanda
Crea un file di testo semplice in c ++ tra 50 e 100 MB con il contenuto 'Prima riga aggiunta' dovrebbe essere inserito nel file per 4 milioni di volte
Soluzione
usando il vecchio file io
fopen il file per la scrittura.
fseek alla dimensione del file desiderata - 1.
riscrivi un singolo byte
Chiudi il file
Altri suggerimenti
Il modo più veloce per creare un file di una certa dimensione è semplicemente creare un file di lunghezza zero usando creat ()
o open ()
e quindi cambiare la dimensione usando chsize ()
. Questo semplicemente assegnerà blocchi sul disco per il file, il contenuto sarà quello che è successo in quei blocchi. È molto veloce poiché non è necessario eseguire la scrittura del buffer.
Non sono sicuro di aver capito la domanda. Vuoi assicurarti che ogni carattere nel file sia un carattere ASCII stampabile? Se è così, che dire di questo? Riempie il file con " abcdefghabc .... "
#include <stdio.h>
int main ()
{
const int FILE_SiZE = 50000; //size in KB
const int BUFFER_SIZE = 1024;
char buffer [BUFFER_SIZE + 1];
int i;
for(i = 0; i < BUFFER_SIZE; i++)
buffer[i] = (char)(i%8 + 'a');
buffer[BUFFER_SIZE] = '\0';
FILE *pFile = fopen ("somefile.txt", "w");
for (i = 0; i < FILE_SIZE; i++)
fprintf(pFile, buffer);
fclose(pFile);
return 0;
}
Non hai menzionato il sistema operativo, ma suppongo che creat / open / close / write siano disponibili.
Per una scrittura e un'assunzione veramente efficienti, diciamo, una pagina di 4k e dimensioni del blocco del disco e una stringa ripetuta:
- apri il file.
- alloca 4k * numero di caratteri nella tua stringa ripetuta, idealmente allineata a un limite di pagina.
- stampa 4 volte la stringa ripetuta nella memoria, riempiendo i blocchi con precisione.
- Usa write () per scrivere i blocchi su disco tutte le volte che è necessario. Potresti voler scrivere un pezzo parziale per l'ultimo blocco per ottenere la dimensione corretta.
- chiudi il file.
Questo evita il buffering di fopen () e degli amici, il che è positivo e negativo: il loro buffering significa che sono simpatici e veloci, ma non saranno ancora efficienti come questo, che non ha alcun sovraccarico di lavoro con il buffer.
Questo può essere facilmente scritto in C ++ o C, ma presuppone che userete le chiamate POSIX anziché iostream o stdio per motivi di efficienza, quindi è al di fuori delle specifiche della libreria principale.
Il modo più veloce per creare file di grandi dimensioni in c ++? Ok. Presumo che il modo più veloce significhi quello che richiede il minor tempo di esecuzione.
Crea un file di testo semplice in c ++ tra 50 e 100 MB con il contenuto "Aggiunta prima riga" da inserire nel file per 4 milioni di volte.
preallocate il file usando il vecchio file io
fopen the file for write.
fseek to the desired file size - 1.
fwrite a single byte
fclose the file
create a string containing the "Added first line\n" a thousand times.
find it's length.
preallocate il file usando il vecchio file io
fopen the file for write.
fseek to the the string length * 4000
fwrite a single byte
fclose the file
open the file for read/write
loop 4000 times,
writing the string to the file.
close the file.
Questa è la mia ipotesi migliore. Sono sicuro che ci sono molti modi per farlo.