Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 处理巨大的csv文件_Python_Python 2.7_Python 3.x - Fatal编程技术网

Python 处理巨大的csv文件

Python 处理巨大的csv文件,python,python-2.7,python-3.x,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) prin

假设我有一个巨大的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)


哪种方法更好?第一个使用发电机有什么优势吗?如果不是,以防使用发电机对我们有好处?

我怀疑这不会有多大影响。我们在这里讨论的是在可能会受到I/O限制的工作负载上进行的纳秒级CPU优化

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

如果没有——也就是说,您将在可能大几个数量级的数据集上重复执行此操作——您可能希望集中精力解决I/O问题。您可能需要跨多个磁盘分割数据,并使用多个线程对其进行攻击。这是一个很好的例子。是一个常用的引擎,用于分割和征服CSV文件

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


(充分披露:我是AWS的解决方案架构师,但这里的观点是我自己的。)

我怀疑这不会有多大影响。我们在这里讨论的是在可能会受到I/O限制的工作负载上进行的纳秒级CPU优化

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

如果没有——也就是说,您将在可能大几个数量级的数据集上重复执行此操作——您可能希望集中精力解决I/O问题。您可能需要跨多个磁盘分割数据,并使用多个线程对其进行攻击。这是一个很好的例子。是一个常用的引擎,用于分割和征服CSV文件

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


(充分披露:我是AWS的解决方案架构师,但这里的观点是我自己的。)

在您的特定示例中,使用生成器除了使代码更长、更复杂之外没有其他好处。reader已经是一个生成器,因此,第一个代码只是将生成器包装到生成器中,总体上比需要的更慢、更复杂。哦,明白了。。谢谢@mI,我想你需要一些线程。在这种情况下,这个示例也将生成器包装到生成器中,因为readline是一个生成器?在您的特定示例中,使用生成器除了使您的代码更长、更复杂之外没有其他好处。
csv.reader
已经是一个生成器,因此,第一个代码只是将生成器包装到生成器中,总体上比需要的更慢、更复杂。哦,明白了。。谢谢@mI,我想你需要一些线程。在这种情况下,这个示例也将生成器包装到生成器中,因为readline是一个生成器?
import csv
fp=open("d:\\testdata.csv")
reader=csv.reader(fp)
sum=0
for i in reader:
  sum+=int(i[1])
print(sum)