【问题标题】:Iterate over 10GB+ binary file迭代超过 10GB+ 二进制文件
【发布时间】:2016-09-24 01:26:26
【问题描述】:

在不借助 boost 库的情况下读取 10GB 二进制文件并解析每个字节的最简单方法是什么?

它与流、文件、内存映射文件等令人困惑。

我真的只是想要这样的东西:

char* buffer = read(filename, binary);

while(buffer != EOF){
    //Read byte
    ++buffer;
}

性能确实很重要,因为文件大小。

【问题讨论】:

  • std::ifstream 有什么问题?
  • 对于简单的块,我总是回退到 C 和无缓冲的 FILE* 处理。
  • 内存映射文件最好。
  • @Jichao:为什么说内存映射文件最好?
  • “它对流、文件、内存映射文件等非常混乱。” - 您必须自己尝试并对其进行基准测试,然后在您的平台上使用最快的。库、操作系统、编译器、内存{磁盘、SSD、RAM 等}、DMA 实现等仍在以使某些事情更快的方式发展......我们不再处于可以随意告诉你哪个最快而不看的时代实际实现

标签: c++ performance c++11


【解决方案1】:

如果您想获得良好的顺序访问性能(从头到尾读取),请使用fread()。您可以将FILE* 存储在std::shared_ptr 中以用于RAII:

std::shared_ptr<FILE> file(fopen(...), fclose);

您可以忽略 C++ 流、内存映射文件、Boost 等。这些都不会比 fread() 更快。

【讨论】:

  • “没有一个比fread()更快” - 我们需要这种ipsedixitism的证据。有一些数字可以支持您的陈述吗?
  • @WhiZTiM:我已经多次测试过这些东西。欢迎任何想要 100% 确定其特定平台上的特定用例的人编写自己的基准测试。
【解决方案2】:

由于您不关心性能,
ifstream 的简单 while 循环可以一次提取一个字节:

#include <iostream>
#include <fstream>

int main(){

  std::ifstream infile("file.txt");

  while (infile){

    //get next byte
    char c;
    infile.get(c);

    //process byte
    std::cout << c;
  }

}

【讨论】:

  • 您肯定不会一次读取一个字节的 10 GB 输入文件。
  • @JohnZwinck 为什么不呢?为您执行实际 I/O 的代码知道得更好,并且会根据需要读取有效大小的块,除非您明确告诉它不要这样做。我可以想象很多需要逐字节读取的应用程序。
  • @xaxxon 单词。 “最佳算法”是否更适合您?
猜你喜欢
  • 2020-05-28
  • 2011-06-01
  • 1970-01-01
  • 2012-09-05
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多