我目前正在尝试从 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 文件中,因此当我经过它们时我会离开循环以节省时间。
我的问题是:
我的电脑有 8GB RAM,运行 64 位 Windows 7,处理器为 3.40 GHz(不确定您需要什么信息)。
处理大 CSV 文件并避免内存错误的几种方法如下:
你可以使用 pandas 中的 read_csv 函数的 chunksize 参数,按块读取数据,而不是一次性读取整个文件。这样可以避免内存占用过高的问题。
pandas
read_csv
chunksize
import pandas as pd def getstuff(filename, criterion): chunksize = 10000 # 每次读取10000行 data = [] for chunk in pd.read_csv(filename, chunksize=chunksize): for index, row in chunk.iterrows(): 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 return data
在你当前的代码中,每次都会遍历整个文件。可以考虑优化你的过滤条件,减少数据的读取量。
如果 pandas 依然无法满足需求,你可以考虑用 csv 模块逐行读取,并对每一行进行处理。这种方法更低级,但也更省内存。
csv
如果你在处理大文件时遇到内存错误,可以考虑增加系统的虚拟内存,或者使用64位的Python环境,这样可以更好地利用系统的内存。
通过减少不必要的数据存储或转换为更高效的数据结构(如 numpy 数组)可以减少内存占用。
numpy
可以根据你的具体需求来选择适合的方案。如果你有更多问题,欢迎继续讨论!