读取一个巨大的.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文件中一起列出,所以当我通过它们以节省时间时离开循环。
我的问题是:
-
我怎样才能设法让这个更大的文件工作?
-
有什么办法可以让它更快?
我的电脑有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的博客上, 以便进行振动分析 。
使用pytables。 “PyTables是一个用于pipe理分层数据集的软件包,旨在高效且轻松地处理大量的数据”。