我正在尝试处理一个大约有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的位置。
答案 0 :(得分:5)
以下是我想到的一些事情 -
n
个较小的文件。启动一个主进程,该进程分叉n
个子进程并行处理这两个块文件。那样在理论上你会在100秒内处理n * 50,000
行。请注意,我在说“理论上”,因为如果所有这些都发生在单个硬盘上,则硬盘可能无法同时传输数据。因此,在满足并发请求时可能会出现延迟(但在现代操作系统上运行的I / O算法会再次缓存正在读取的文件的一部分,这可能会使您接近上述数字)。x machines
,每个y harddisks
。制作文件的x*y chunks
并将其放入这些计算机中。并运行您的处理程序。所以你在同样的100秒内处理x*y*50000 rows
。吞吐量随着所使用的机器和硬盘的数量而增加。您可能不得不处理分布式计算的一些新问题(如可用性,容错等),但仍然...... 第2,3和4点的前提是假设CSV文件中的每一行都可以独立处理,并且行之间没有依赖关系。
答案 1 :(得分:0)
最后,我找到了最适合我当前要求的完美解决方案。
以前这项任务大约需要20-24小时,现在需要大约半小时。
我正在寻找的编程模型是Map Reduce编程模型。这很容易使用,并且易于编码以满足我的要求。
它真的更快&高效编写:我正在使用gpmapreduce实用程序和Python编程语言。
感谢:@ Srikar-Appal它的almot类似于他的第四个解决方案 - 基于此我启发了使用mapreduce模型。