c# – c文本文件读取性能

我正在尝试将c#程序迁移到c.
c#程序逐行读取1~5 gb大小的文本文件,并对每行进行一些分析.
c#代码如下所示.
using (var f = File.OpenRead(fname))
using (var reader = new StreamReader(f))
    while (!reader.EndOfStream) {
        var line = reader.ReadLine();
        // do some analysis
    }

对于具有700万行的给定1.6 gb文件,此代码大约需要18秒.

我首先编写的用于迁移的c代码如下所示

ifstream f(fname);
string line;    
while (getline(f,line)) {
    // do some analysis
}

上面的c代码大约需要420秒.我写的第二个c代码如下所示.

ifstream f(fname);
char line[2000];
while (f.getline(line,2000)) {
    // do some analysis
}

上面的c大约需要85秒.

我尝试的最后一个代码是c代码,如下所示.

FILE *file = fopen ( fname,"r" );
char line[2000];
while (fgets(line,2000,file) != NULL ) {
    // do some analysis
}
fclose ( file );

上面的c代码大约需要33秒.

最后两个代码,将行解析为char []而不是字符串,将char []转换为字符串需要大约30秒.

有没有办法提高c / c代码性能来逐行读取文本文件以匹配c#性能
(补充:我正在使用带有VC 10.0,x64的Windows 7 64位操作系统)

解决方法

提高文件读取性能的最佳方法之一是使用内存映射文件(Unix上的mmap(),Windows上的CreateFileMapping()等).然后,您的文件在内存中显示一个平坦的字节块,您可以比缓冲I / O更快地读取它.

对于大于千兆字节左右的文件,您将需要使用64位操作系统(使用64位进程).我这样做是为了处理一个30 GB的Python文件,效果很好.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...