处理巨大的csv文件

时间:2017-11-12 21:26:51

标签: python python-2.7 python-3.x

让我们假设我有一个巨大的csv(大约10Gb)文件,如下所示:

name1,150
name2,89
name3,50

现在我想得到所有第二列的总和,我用两种方式编写代码。

import csv
fp=open("d:\\testdata.csv")

def total(pointer):
reader=csv.reader(pointer)
 for i in reader:
     yield (i[1])
sum=0
for t in total(fp):
 sum+=int(t)
print(sum)

import csv
fp=open("d:\\testdata.csv")
reader=csv.reader(fp)
sum=0
for i in reader:
  sum+=int(i[1])
print(sum)

哪种方法更好?第一个使用发电机有什么优势吗?如果没有,如果使用发电机对我们有利吗?

1 个答案:

答案 0 :(得分:0)

我怀疑它并不重要。我们在讨论可能会受I / O限制的工作负载上的纳秒CPU优化。

让我们退后一步。这是一次性的操作吗?您的数据大小是否真正为10 GB?如果是这样,停止;你完成了。花时间在Stack Overflow上发布将是代码的主要成本。 : - )

如果不是 - 也就是说,你将会重复这样做,对可能数量级更大的数据集 - 你可能想要专注于修复I / O问题。您可能需要跨多个磁盘拆分数据并使用多个线程对其进行攻击。这是typical MapReduce patternApache Presto是分裂和征服CSV文件的常用引擎。

如果像我一样,你懒得弄清楚如何设置Presto,请查看托管解决方案,例如Amazon Athena(基于Presto)或Google BigQuery。两者都有Python SDK。

(完全披露:我是AWS的解决方案架构师,但这里的意见是我自己的。)