【问题标题】:Efficiently read a portion of text in C++高效读取 C++ 中的部分文本
【发布时间】:2015-12-21 11:29:56
【问题描述】:

我已经阅读了thisthis 关于如何利用boost::spirit 库在C++ 中有效读取大量文本(第二个问题中的浮动)的问题。

据我所见,上述问题中提出的解决方案读取整个文本,而我需要读取输入文本的部分(例如从 char x 到 char y)。

我可以为此目的利用上面的库吗?否则我怎么能有效地做到这一点?

【问题讨论】:

  • 那么,您知道文件中的偏移量,并且您想从该偏移量读取另一个偏移量?那块有多大?
  • 没错。但是,这对于 map/reduce 并行项目是必需的,因此每个块的大小可能为 GB。
  • 单 GB 还是“数百 GB”?另外,文件是否比您机器的内存大?
  • 你说的很对,抱歉我的描述不够。但是最多 10GB(因为我的机器内存是 12GB)。
  • 所以我个人的做法是mmapstartOffset,大小为(endOffset - startOffset)[或相应的Windows功能]。

标签: c++ boost text


【解决方案1】:

您甚至不需要映射文件的一部分,因为 mmap 只是虚拟地映射内存块。实际页面仅按需加载,因此您可以映射文件的全部 12GiB,即使您只有 4GiB 的物理 RAM(甚至不需要交换)。

如果您的文件是基于文本的,您需​​要从文件中的随机位置查找行首。

类似的例子是这里的第二种方法:Using boost::iostreams::mapped_file_source with std::multimap

【讨论】:

  • 巨大的警告说,映射整个文件仅在 64 位架构上是安全的,有些人会说,当定义明确时,不映射您需要的确切部分并且已知的子集是草率的编程。
  • 有些人会说这不是一个很大的警告;)
  • 到处都是安全的。它可能并非在任何地方都有效
  • 不,到处都不安全。据我所知,你知道,如果你在 32 位上声明所有大的连续地址空间块,只在 DLL 等之间留下小片段,你会得到一些非常奇怪和不可预测的错误和故障,不仅在你自己的代码中,而且在操作系统中代码。从本质上讲,地址空间不足与内存不足一样存在问题和不可预测 - 大多数代码,包括操作系统代码,由于缺乏测试/谁在乎/无论如何都很容易避免而无法很好地应对这种情况。跨度>
  • @NiallDouglas 认为这是一件合理的事情。真的只是内存不足。我想知道什么操作系统会应对得如此糟糕。听起来确实是绘制子区域的合理动机
猜你喜欢
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多