gpt4 book ai didi

c# - C++文本文件读取性能

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:22:32 26 4
gpt4 key购买 nike

我正在尝试将 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[] 而不是字符串,需要大约 30 秒以上才能将 char[] 转换为字符串。

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

最佳答案

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

对于大于 1 GB 左右的文件,您需要使用 64 位操作系统(使用 64 位进程)。我这样做是为了用 Python 处理一个 30 GB 的文件,结果非常好。

关于c# - C++文本文件读取性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7156613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com