让我们假设我有一个巨大的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)
哪种方法更好?第一个使用发电机有什么优势吗?如果没有,如果使用发电机对我们有利吗?
答案 0 :(得分:0)
我怀疑它并不重要。我们在讨论可能会受I / O限制的工作负载上的纳秒CPU优化。
让我们退后一步。这是一次性的操作吗?您的数据大小是否真正为10 GB?如果是这样,停止;你完成了。花时间在Stack Overflow上发布将是代码的主要成本。 : - )
如果不是 - 也就是说,你将会重复这样做,对可能数量级更大的数据集 - 你可能想要专注于修复I / O问题。您可能需要跨多个磁盘拆分数据并使用多个线程对其进行攻击。这是typical MapReduce pattern。 Apache Presto是分裂和征服CSV文件的常用引擎。
如果像我一样,你懒得弄清楚如何设置Presto,请查看托管解决方案,例如Amazon Athena(基于Presto)或Google BigQuery。两者都有Python SDK。
(完全披露:我是AWS的解决方案架构师,但这里的意见是我自己的。)