c++文本文件读取性能
c++ text file reading performance
我正在尝试将c#程序迁移到c++。c#程序逐行读取1~ 5gb大小的文本文件,并对每行进行一些分析。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#性能?(补充:我使用windows 7 64位操作系统与vc++ 10.0, x64)
提高文件读取性能的最佳方法之一是使用内存映射文件(Unix上的mmap()
, Windows上的CreateFileMapping()
等)。然后你的文件在内存中显示为一个平坦的字节块,你可以读它比做缓冲I/o快得多。
对于大于1 gb左右的文件,您将希望使用64位操作系统(带有64位进程)。我已经用Python处理了一个30gb的文件,效果非常好。
我建议两件事:
使用f.rdbuf()->pubsetbuf(...)
设置更大的读缓冲区。我注意到当使用更大的缓冲区时,fstream性能有了一些非常显著的提高。
代替getline(...)
使用read(...)
读取更大的数据块并手动解析它们
优化编译。c++有相当多的理论开销,优化器将消除这些开销。例如,许多简单的字符串方法将被内联。这可能就是为什么你的char[2000]
版本更快。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 与普通变量相比,仅仅读取原子变量的性能有什么不同吗
- 多个 OpenMP 线程读取(而不是写入)共享变量的性能成本?
- 在C 中读取大型CSV文件性能问题
- Linux 与 Windows,C++读取 CSV 文件的运行时性能差异
- C和C++文件读取性能的比较
- 在Windows上读取性能数据计数器是否需要任何特殊的安全权限
- 从文件中读取大量数据并以有效的方式解析日期.如何提高海量数据的性能
- 从标准输出读取奇怪的性能问题
- 是否有可能通过使用openMP在fstream(文件读取)上获得一些性能提升
- 堆与读取Map最左边节点的相对性能
- 读取二进制文件的性能
- 如何在读取文件时获得更高的性能
- 逐行读取文件与读取整个文件时的性能
- c++文本文件读取性能
- 如何在C++中读取性能计数器
- C++ 从磁盘写入和读取性能