[英]processing huge csv file
假设我有一个巨大的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)
哪种方法更好? 第一个使用generator的有什么优势吗? 如果不是,以防万一使用发电机对我们有利?
我怀疑这无关紧要。 在这里,我们谈论的是CPU纳秒级优化的工作负载,该工作负载可能会受到I / O的约束。
让我们退后一步。 这是一次性的操作吗? 您的数据大小确实是10 GB吗? 如果是这样,停止; 你完成了。 花时间在Stack Overflow上发布将是代码的主要成本。 :-)
如果不是这样-也就是说,您将在可能更大的数量级的数据集上重复执行此操作-您可能需要集中精力解决I / O问题。 您可能需要将数据拆分到多个磁盘上,并使用多个线程对其进行攻击。 这是典型的MapReduce模式 。 Apache Presto是用于分隔和征服CSV文件的常用引擎。
如果像我一样,您懒得弄清楚如何设置Presto,请看一下托管解决方案,例如Amazon Athena (基于Presto)或Google BigQuery 。 两者都有Python SDK。
(完整披露:我是AWS的解决方案架构师,但是这里的观点属于我自己。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.