2013-03-18 95 views
3

选项: 1.将整个文件读入一个巨大的缓冲区,然后解析。 2.将文件映射到虚拟内存。 3.以块为单位读取文件并逐个解析它们。什么是从大文件中读取格式化数据的最有效方式?

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

+3

“大”有多大? – 2013-03-18 23:42:41

+0

选项#3通常会是你最好的。而且C++有内置的方法来帮助这种方式! – 2013-03-18 23:43:55

+0

#1会将您的缓存打包为“大型”文件。大多数情况下#2和#3的速度相同。 #2通常更方便。 – 2013-03-18 23:45:41

回答

2

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

+0

操作系统将进行预先存储,所以即使只有一个线程,IO和计算也会重叠。在使用多个线程处理IO绑定任务时没有意义。 – 2013-03-19 01:10:13

0

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

特别是如果真的有大量的数据需要处理,选项1和2将无法工作,因为主存的可用数量会对此类尝试造成上限。

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

在解决问题中提到的问题之前,检查是否有机会组织数据以便以不必要的方式处理整个块,从而节省数据。

就效率而言,在选择任何一种方法时都会赢得常数,而另一方面,通过正确组织数据可能会有更好的改进。数据越大,您的决定就越重要。

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

  • 有什么规律来你要处理的数据?
  • 数据大部分是静态的还是高度动态的?
  • 是否必须按顺序解析或可以并行处理数据?
0

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