如何将大型CSV文件处理为Python可用格式?

3

我正在尝试处理一个包含约73亿行的CSV文件,


我将处理后的行存储到一个以字符串为键、元组为值的python collections.defaultdict中,但是将这个数据结构存储到字典中需要大约100秒来存储50K行。

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

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

CSV ID、value的示例行:

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

数据结构:

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

基本上我正在尝试实现一个全文搜索功能的算法 - 为此,我需要维护每个4个字符部分中值的位置以及其关联的ID。


可能是Python中大型.csv文件的并行处理的重复问题。 - hjpotter92
2
当你处理如此多的行时,显然必须进行“即时”处理,因为在大多数机器上无法存储这么多数据(73亿行=可能超过1 TB的内存?)。如果不了解更多关于数据结构的信息,很难给出任何建议;但几乎可以肯定,字典结构不是最有效的方法。这是什么类型的数据,你是如何聚合它的? - Floris
2
为什么不直接将文件加载到数据库中呢? - Burhan Khalid
它仅被从数据库中卸载以进行处理;在处理后,它会生成另一个表格,因此一旦处理完成,它将被重新加载到数据库中。 - shahjapan
迭代遍历 170 亿行的数据库例程会导致数据库崩溃吗? - shahjapan
显示剩余4条评论
2个回答

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

0

终于我找到了完美的解决方案,非常适合我的当前需求。

以前这个任务需要运行大约20-24小时,现在只需要半个小时左右。

我正在寻找的编程模型是Map Reduce编程模型。它易于使用和编码,非常适合我所需的要求。

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

感谢:@Srikar-Appal,它几乎类似于他的第四个解决方案 - 我受其启发使用mapreduce模型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接