从大文件中读取格式化数据的最有效方法是什么?

时间:2013-03-18 23:40:58

标签: c++ c file input io

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

该文件可以包含非常随意的数据,但主要是数字,值,字符串等以某些方式格式化(逗号,括号,引号等)。 哪个选项会给我最大的整体表现?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

特别是如果要处理的数据非常庞大,则选项1.和2.无论如何都不会起作用,因为主存储器的可用数量构成了此类任何尝试的上限。

最有可能的是,效率方面的最大收获可以通过(重新)构建您要处理的数据来实现。

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

就效率而言,在选择任何提到的方法时只有一个不变的胜利,而另一方面,通过正确的数据组织可能会有更好的改进。数据越大,您的决策就越重要。

有关数据的一些事实看起来很有趣,包括:

  • 您要处理的数据是否有任何常规模式?
  • 数据主要是静态的还是高度动态的?
  • 是否必须按顺序解析或者是否可以并行处理数据?

答案 2 :(得分:0)

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