3

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

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

4

3 回答 3

2

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

于 2013-03-18T23:49:08.603 回答
0

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

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

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

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

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

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

  • 您要处理的数据是否有任何常规模式?
  • 数据主要是静态的还是高度动态的?
  • 它必须按顺序解析还是可以并行处理数据?
于 2013-03-19T00:00:12.507 回答
0

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

于 2013-03-19T00:15:45.540 回答