读取一个巨大的.csv文件

我目前正在尝试从Python 2.7中的.csv文件读取数据,最多有100万行,200列(文件范围从100mb到1.6gb)。 我可以做到这一点(非常缓慢)的文件与30万行以下,但一旦我上面,我得到内存错误。 我的代码如下所示:

def getdata(filename, criteria): data=[] for criterion in criteria: data.append(getstuff(filename, criteron)) return data def getstuff(filename, criterion): import csv data=[] with open(filename, "rb") as csvfile: datareader=csv.reader(csvfile) for row in datareader: if row[3]=="column header": data.append(row) elif len(data)<2 and row[3]!=criterion: pass elif row[3]==criterion: data.append(row) else: return data 

getstuff函数中的else子句的原因是,所有符合条件的元素都将在csv文件中一起列出,所以当我通过它们以节省时间时离开循环。

我的问题是:

  1. 我怎样才能设法让这个更大的文件工作?

  2. 有什么办法可以让它更快?

我的电脑有8GB RAM,运行64位Windows 7,处理器是3.40 GHz(不确定你需要什么信息)。

非常感谢您的帮助!

您正在将所有行读取到列表中,然后处理该列表。 不要这样做

在生成行时处理行。 如果您需要先过滤数据,请使用生成器函数:

 import csv def getstuff(filename, criterion): with open(filename, "rb") as csvfile: datareader = csv.reader(csvfile) count = 0 for row in datareader: if row[3] in ("column header", criterion): yield row count += 1 elif count < 2: continue else: return 

我也简化了你的filtertesting; 逻辑是相同的,但更简洁。

您现在可以直接循环getstuff() 。 在getdata()做同样的getdata()

 def getdata(filename, criteria): for criterion in criteria: for row in getstuff(filename, criterion): yield row 

现在循环直接在你的代码中的getdata()

 for row in getdata(somefilename, sequence_of_criteria): # process row 

你现在只在内存中保留一行 ,而不是每条标准的数千行。

yield函数是一个生成器函数 ,这意味着在开始循环之前它不会做任何工作。

虽然Martijin的答案是最好的。 这是一个更直观的方式来处理初学者的大型csv文件。 这允许您一次处理行或组块。

 import pandas as pd chunksize = 10 ** 8 for chunk in pd.read_csv(filename, chunksize=chunksize): process(chunk) 

我做了大量的振动分析,并查看大量的数据(数十亿和数亿个点)。 我的testing显示pandas.read_csv()函数比numpy.genfromtxt()快20倍。 而genfromtxt()函数比numpy.loadtxt()快3倍。 看来你需要大pandas的大数据集。

我将这个testing中使用的代码和数据集发布在讨论MATLAB和Python的博客上, 以便进行振动分析 。

我最近试图解决同样的问题,但发现pythonpandas包是合理的效率。

你可能想在这里检查, http://pandas.pydata.org/

pandas是大数据的高性能数据分析库。

使用pytables。 “PyTables是一个用于pipe理分层数据集的软件包,旨在高效且轻松地处理大量的数据”。