2013-04-01 148 views
4

在運行期間,我經常需要讀取較大文件(300 MB)的小部分。 目前,我總是打開的文件,從中讀取,然後再次關閉它這樣的:C++從大文件快速讀取的最佳方式

FILE *file =fopen(szFileName,"rb"); 
if (file) 
{ 
    fseek(file,iFirstByteToRead, SEEK_SET); 
    fread(nEncodedBytes,sizeof(unsigned char), iLenCompressedBytes, file); 
    fclose(file); 
} 

但那是太慢了,因爲我做的如此頻繁。 另外我不確定fread是否可以加速。

請問這種情況的最佳做法是什麼?

+0

你不能做太多的事情。原因在於,與存儲器訪問相比,在大文件中查找位置和從磁盤讀取數據是非常緩慢的操作。該文件太大 - 最佳值爲64/128 Mb(正如Google在他們的數據庫中所證明的那樣)。而且,如果你經常這樣做,你很可能會很快損壞磁盤。 – SChepurin

+0

這不是C++,雖然 – blue

回答

1

保持文件打開,你會做得更好。

嘗試mmap以改善性能仍然。

+0

我曾閱讀過有關CreateFileMapping函數。這還會有幫助嗎?或者有什麼好處? – tmighty

+0

這是mmap的Windows等價物。 – StilesCrisis

0

與文件控制有關的工作總是會導致昂貴的成本。如果您多次控制文件管理,則不必關閉文件指針。

像下面,一旦你的文件指針,

FILE *stream = fopen(stream, 「rb」); 

if (stream != NULL) 

你在你的計劃完成後,關閉流文件指針,如果你還必須管理大量的文件,你可以使用一個線程,它專用於讀取文件。