【问题标题】:What is the most efficient way to read formatted data from a large file?从大文件中读取格式化数据的最有效方法是什么?
【发布时间】:2013-03-07 12:11:17
【问题描述】:

选项: 1. 将整个文件读入一个巨大的缓冲区,然后解析。 2. 将文件映射到虚拟内存。 3. 分块读取文件,并逐个解析。

该文件可以包含相当任意的数据,但主要是数字、值、字符串等以特定方式格式化(逗号、括号、引号等)。 哪个选项会给我最好的整体性能?

【问题讨论】:

  • “大”有多大?
  • 选项#3 通常是你最好的。而 C++ 有内置的方法来帮助实现这一点!
  • #1 会在缓存中搜索“大”文件。在大多数情况下,#2 和#3 的速度相同。 #2 通常更方便。
  • 可能是 #2 - 让您的操作系统处理缓存和分页。

标签: c++ c file input io


【解决方案1】:

如果文件非常大,那么您可以考虑使用带有选项 2 或 3 的多个线程。每个线程可以处理单个文件/内存块,并且您可以重叠 IO 和计算(解析) 这边走。

【讨论】:

  • 操作系统会做预缓存,所以即使你只有一个线程,IO和计算也会重叠。使用多个线程来完成一个 IO 绑定的任务是没有意义的。
【解决方案2】:

很难对您的问题给出一般性的答案,因为选择“正确”的策略在很大程度上取决于您正在阅读的数据的组织方式。

特别是如果有大量数据需要处理,选项 1. 和 2. 无论如何都不起作用,因为可用的主内存量对任何此类尝试构成上限。

在效率方面的最大收益很可能可以通过(重新)结构化您要处理的数据来实现。

在解决问题中提到的问题之前,检查是否有机会以某种方式组织数据以避免不必要地处理整个块,这将是我尝试改进的主要点。

就效率而言,选择上述任何一种方法都是一个常数,但另一方面,正确组织数据可能会带来更好的改进。数据越大,您的决定就越重要。

关于数据的一些事实似乎很有趣,值得考虑包括:

  • 您要处理的数据是否有规律的模式?
  • 数据大多是静态的还是高度动态的?
  • 是必须按顺序解析还是可以并行处理数据?

【讨论】:

    【解决方案3】:

    一次性读取整个文件然后从文本转换为二进制数据是没有意义的;写起来更方便,但是你用完内存更快。我会分块阅读文本并随时转换。无论如何,转换后的数据(以二进制格式而不是文本格式)可能会比原始源文本占用更少的空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-06
      • 2014-02-01
      • 2014-11-03
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多