如何将巨大的CSV文件处理成python?

时间:2013-06-09 05:21:12

标签: python csv optimization data-structures

我正在尝试处理一个大约有73亿行的CSV文件 我将已处理的行存储到python collections.defaultdict中,其中string为键,元组为value,但是将此数据结构存储到字典中需要大约100秒来存储50K行。

我以50K行的块处理CSV文件,以确保系统不会耗尽内存或避免磁盘溢出I / O交换操作。

稍后我将这些处理过的CSV文件加载到表中并进行FULL OUTER JOIN以获得合并结果。

CSV ID的示例ROW,值:

"10203","http://google.com/goo.gl?key='universe'&value='somedata'"

数据结构:

dt = {'goog': [(10203, 1), ...}

基本上我试图实现全文搜索功能的算法 - 为此我需要保持4个字符的部分值及其相关ID的位置。

2 个答案:

答案 0 :(得分:5)

以下是我想到的一些事情 -

  1. 正如@Burhad所说,为什么你不能直接将这个文件加载到DB中?像你一样的任何类型的字符串处理都可以在像MySQL这样的常规RDBMS中完成。他们有你知道的字符串功能。一个简单的数据库例程可以在数据库本身内完成所有这一切,甚至不需要将数据写入文件。
  2. 如果您不想采取上述方法。我建议你试试这个。将文件拆分为允许说n个较小的文件。启动一个主进程,该进程分叉n个子进程并行处理这两个块文件。那样在理论上你会在100秒内处理n * 50,000行。请注意,我在说“理论上”,因为如果所有这些都发生在单个硬盘上,则硬盘可能无法同时传输数据。因此,在满足并发请求时可能会出现延迟(但在现代操作系统上运行的I / O算法会再次缓存正在读取的文件的一部分,这可能会使您接近上述数字)。
  3. 上述方法的扩展是使用多个硬盘,它们都是同一本地计算机上同一raid级别的一部分。
  4. 如果您需要更多吞吐量,请考虑分布式计算。比如说x machines,每个y harddisks。制作文件的x*y chunks并将其放入这些计算机中。并运行您的处理程序。所以你在同样的100秒内处理x*y*50000 rows。吞吐量随着所使用的机器和硬盘的数量而增加。您可能不得不处理分布式计算的一些新问题(如可用性,容错等),但仍然......
  5. 第2,3和4点的前提是假设CSV文件中的每一行都可以独立处理,并且行之间没有依赖关系。

答案 1 :(得分:0)

最后,我找到了最适合我当前要求的完美解决方案。

以前这项任务大约需要20-24小时,现在需要大约半小时。

我正在寻找的编程模型是Map Reduce编程模型。这很容易使用,并且易于编码以满足我的要求。

它真的更快&高效编写:我正在使用gpmapreduce实用程序和Python编程语言。

感谢:@ Srikar-Appal它的almot类似于他的第四个解决方案 - 基于此我启发了使用mapreduce模型。