我目前正在尝试从Python 2.7中的.csv文件中读取数据,这些文件具有多达100万行和200列(文件范围从100MB到1.6GB)。我可以(非常缓慢地)对300,000行以下的文件执行此操作,但一旦我超过这个值,就会出现内存错误。我的代码如下所示:
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.我怎样才能让它与更大的文件一起工作?
1.有什么方法可以让它更快吗?
我的电脑有8GB RAM,运行64位Windows 7,处理器是3. 40 GHz(不确定你需要什么信息)。
8条答案
按热度按时间yx2lnoni1#
您正在将所有行阅读到一个列表中,然后处理该列表。不要这样做。
在生成行时处理它们。如果需要先过滤数据,请使用生成器函数:
字符串
我还简化了您的过滤器测试;逻辑是相同的,但更简洁。
因为您只匹配一个符合条件的行序列,所以您还可以使用:用途:
型
现在可以直接在
getstuff()
上循环。在getdata()
中执行相同的操作:型
现在直接在代码中循环
getdata()
:型
你现在只需要在内存中保存 * 一行 *,而不是每个条件上千行。
yield
使函数成为生成器函数,这意味着它不会做任何工作,直到你开始循环它。6l7fqoea2#
虽然Martijin的答案是最好的,但这里有一个更直观的方法来处理初学者的大csv文件。这允许你一次处理多组行或块。
字符串
7xzttuei3#
我做了大量的振动分析,并查看了大型数据集(数千万和数亿个点)。我的测试显示pandas.read_csv()函数比numpy.genfromtxt()快 20 倍。genfromtxt()函数比numpy.loadtxt()快3倍。看起来你需要 * pandas来处理大型数据集。
我在一个讨论MATLAB vs Python for vibration analysis的博客上发布了我在这个测试中使用的代码和数据集。
tzdcorbm4#
如果有人问这个问题,使用pandas和'chunksize'和'usecols'可以帮助我比其他建议的选项更快地读取一个巨大的zip文件。
字符串
sg3maiej5#
对我有用的是,
字符串
另一个可行的解决方案是:
型
g52tjvyc6#
下面是Python 3另一个解决方案:
字符串
这里
datareader
是生成器函数。kx7yvsdv7#
如果你使用pandas并且有足够的RAM(足以将整个文件读入内存),请尝试将
pd.read_csv
与low_memory=False
一起使用,例如:字符串
goucqfw68#
所有这些答案都在最后使用了一个pd.concat(),它假设过滤后的嵌套框架适合内存,但是如果嵌套框架真的很大,你可以采用这种方法来读取块并在你去的时候附加到文件中。你可以将多处理融入这种方法,并在文件写入上放置一个Lock:
字符串