2012-11-17 12 views
11

Devo leggere file di grandi dimensioni in C utilizzando la funzione read. Mi stavo chiedendo se non fa alcuna differenza quale dimensione del buffer manteniamo in termini di prestazioni. Le dimensioni dei file possono raggiungere fino a decine di GB.dimensione buffer ottimale per la lettura di file in C

+0

Ovviamente le dimensioni del buffer sono importanti, ma "ottimale" dipende. –

+0

Più grande è, meglio è, a ragione. E ci sarà un piccolo vantaggio nell'usare una dimensione del buffer che è una potenza di due (o almeno un multiplo di 512). –

+0

@HotLicks puoi spiegare perché '512' –

risposta

0

Primo: un certo numero di dimensioni del settore logico/fisico del disco, che è possibile verificare utilizzando hdparm. Questo è lo stesso

Suggerimento: il libc fopen(3), fread(3), fwrite(3), ecc funzioni già fanno un buon buffering per voi.

Un altro suggerimento: se non è necessario eseguire lo streaming dell'intero file, ma per accedere in modo casuale a parti di esso, è possibile provare a utilizzare mmap().

+0

fa anche molto buffering anche con 'open | read | write' (cache di pagina + readahead) se non diversamente specificato (' O_DIRECT'/'O_SYNC') – SaveTheRbtz

8

Versione corta.
Dipende. La dimensione del buffer x86 di 4096 byte è un buon inizio (una page size e anche la dimensione del blocco Advanced Format).

Versione più lunga.
In UNIX dipende da kernel, libc, filesystem, hardware, ecc. Non solo su versioni e opzioni di compilazione, ma anche su parametri sintonizzabili di run-time (ad esempio, impostazione read ahead).

Fai da te.
Provalo! Vedi Advanced Programing in UNIX Environment Capitolo 3.9 "I/O Efficiency" per un modo semplice di determinare la migliore dimensione del buffer di lettura/scrittura per un particolare sistema.

Problemi correlati