2010-03-17 61 views
0

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

+0

我会说,这是无法解析的,不知道什么样的文件或你需要做什么处理。我的猜测是,这个问题的目的是在大文件的背景下引发对这些考虑的讨论。 – 2010-03-17 18:10:42

+0

您需要使用支持大量文件的API - 使用32位整数,因此仅限于4GB文件。如果你想要更多,你必须更具体地了解文件中的数据以及你想要做什么。 – 2010-03-17 18:12:02

+1

MapReduce? [http://en.wikipedia.org/wiki/MapReduce] – 2010-03-17 18:12:16

回答

1

如果你有兴趣,你应该检查出HadoopMapReduce这是创建与大(BIG)数据集的想法。

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

0

将“大”数据文件从小文件中分离出来的原因 - 一般来说 - 是将整个文件整合到内存中,还是一次只能从磁盘中加载部分文件。

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

0

这取决于文件以及文件中的数据如何关联。如果您在谈论某些需要处理并输出到数据库或其他文件的独立记录,那么对多线程进程进行多线程将会有所帮助。有一个线程读取记录,然后将其传递给多个线程中的一个线程,这些线程将执行处理数据和执行相应输出的耗时工作。

1

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

  • 创纪录的工厂,从
  • 一个ftp阅读器类下载的FTP流中读取文本流中读取的记录流数据库插入从服务器。

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

+1

尽管流通常是一种明智的方法,但使用它们时假定处理数据元素不依赖于其他数据元素。如果数据高度相互依赖,则流式传输几乎不起作用。 – 2010-03-17 19:03:06

0

除了Bill Carey所说的,文件类型不仅决定了“有意义的块”,还确定了“处理”的含义。

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

0

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

后来我需要处理数百万个测试数据记录,以进行一些性能测试,我在大规模并行计算机上进行测试。我使用了一些Perl将输入文件分成32个部分(以匹配CPU数量),然后产生了32个进程,每个进程将记录转换为一个文件。

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