tk.*_*tk. 6 c c# c++ file-io large-files
我正在尝试将ac#program迁移到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
}
Run Code Online (Sandbox Code Playgroud)
对于具有700万行的给定1.6 gb文件,此代码大约需要18秒.
我首先编写的用于迁移的c ++代码如下所示
ifstream f(fname);
string line;
while (getline(f, line)) {
// do some analysis
}
Run Code Online (Sandbox Code Playgroud)
上面的c ++代码大约需要420秒.我写的第二个c ++代码如下所示.
ifstream f(fname);
char line[2000];
while (f.getline(line, 2000)) {
// do some analysis
}
Run Code Online (Sandbox Code Playgroud)
上面的c ++大约需要85秒.
我尝试的最后一个代码是c代码,如下所示.
FILE *file = fopen ( fname, "r" );
char line[2000];
while (fgets(line, 2000, file) != NULL ) {
// do some analysis
}
fclose ( file );
Run Code Online (Sandbox Code Playgroud)
上面的c代码大约需要33秒.
最后两个代码,将行解析为char []而不是字符串,将char []转换为字符串需要大约30秒.
有没有办法提高c/c ++代码的性能来逐行读取文本文件以匹配c#性能?(补充:我正在使用带有VC++ 10.0,x64的Windows 7 64位操作系统)
提高文件读取性能的最佳方法之一是使用内存映射文件(在Windows mmap()上的Unix CreateFileMapping()等).然后,您的文件在内存中显示为一个平坦的字节块,您可以比缓冲I/O更快地读取它.
对于大于千兆字节左右的文件,您将需要使用64位操作系统(使用64位进程).我这样做是为了处理一个30 GB的Python文件,效果很好.
| 归档时间: |
|
| 查看次数: |
2858 次 |
| 最近记录: |