2013-04-01 109 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) 

你在你的计划完成后,关闭流文件指针,如果你还必须管理大量的文件,你可以使用一个线程,它专用于读取文件。