C++ 从大文件中快速读取的最佳方法

4
在运行时,我经常需要读取更大文件(300 MB)的小部分内容。目前我总是像这样打开文件,从中读取数据,然后再关闭文件:
FILE *file =fopen(szFileName,"rb");
if (file)
{
    fseek( file,iFirstByteToRead, SEEK_SET);
    fread(nEncodedBytes,sizeof(unsigned char), iLenCompressedBytes, file);
    fclose(file);
}

但是这种频繁的操作太慢了。同时,我也不确定fread能否加速。

对于这种情况,最佳实践是什么,请问?


你对此无能为力。原因是在大文件中查找位置和从磁盘读取数据相比内存访问非常缓慢。而且文件太大了 - 最佳大小是64/128 Mb(正如谷歌在他们的数据库中证明的那样)。此外,如果你经常这样做,你会很快损坏磁盘。 - SChepurin
这不是 C++。 - blue
2个回答

1
保持文件打开状态,你会做得更好。
尝试使用mmap来进一步提高性能。

我曾经读过CreateFileMapping函数。它能帮上什么忙吗?或者它有什么用处? - tmighty
这是Windows中mmap的等效实现。 - StilesCrisis

0

与文件控制相关的工作总是会导致昂贵的成本。如果您多次控制文件以进行管理,则无需关闭文件指针。

就像下面这样,一旦获取了文件指针,

FILE *stream = fopen(stream, “rb”);

if (stream != NULL)

在您的程序中完成后,必须关闭流文件指针,如果您需要管理多个文件,则可以使用专用于文件读取的线程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接