如何处理大小如10G的大型数据文件?

时间:2010-03-17 18:05:00

标签: c++ data-structures

我在网上发现了这个未解决的问题。如何处理大小如10G的大型数据文件? 这应该是一个面试问题。有没有系统的方法来回答这类问题?

6 个答案:

答案 0 :(得分:1)

在这种情况下我使用了流式处理。一个例子是当我不得不从ftp服务器下载一个非常大的(在我的情况下为600 MB)csv文件时,提取找到的记录并将它们放入数据库。我结合了三个相互阅读的流:

  • 数据库插入器,用于读取
  • 中的记录流
  • 读取文本流的唱片工厂
  • 从服务器下载ftp流的ftp reader类。

这样我就不必在本地存储整个文件,因此它应该可以处理任意大文件。

答案 1 :(得分:1)

如果您有兴趣,请查看使用大(BIG)数据集创建的HadoopMapReduce

否则,对数据进行分块或流式传输是减少内存大小的好方法。

答案 2 :(得分:0)

“大”数据文件与小数据文件的区别在于 - 广义上说 - 是否可以将整个文件放入内存中,或者是否必须一次从磁盘加载部分文件。 / p>

如果文件太大而无法将整个内容加载到内存中,则可以通过识别文件的有意义块来处理它,然后按顺序读取和处理它们。如何定义“有意义的块”将在很大程度上取决于文件的类型。 (即二进制图像文件需要从大量xml文档进行不同的处理。)

答案 3 :(得分:0)

这取决于文件以及文件中的数据如何相关。如果你正在谈论你需要处理并输出到数据库或其他文件的一堆独立记录的东西,那么多线程化这个过程将是有益的。有一个读取记录的线程,然后将其传递给许多线程中的一个线程,这些线程将执行处理数据和执行适当输出的耗时工作。

答案 4 :(得分:0)

除了Bill Carey所说的,不仅文件类型决定了“有意义的块”,而且还决定了“处理”意味着什么。

换句话说,你要做什么来处理,你如何确定要处理什么将有很大的不同。

答案 5 :(得分:0)

寻找机会将文件拆分,以便可以通过多个进程解决。您没有说文件中的记录是否相关,这使问题更难,但解决方案原则上是相同的 - 确定可以并行处理的互斥数据分区。

前段时间我需要处理数百万条测试数据记录,以便进行大规模并行机器上的性能测试。我使用一些Perl将输入文件拆分为32个部分(以匹配CPU的数量),然后生成32个进程,每个进程将记录转换为一个文件。

因为这项工作并行运行在32个处理器上,所以需要几分钟而不是连续工作的时间。我很幸运,文件中的任何记录都没有依赖关系。