[英]Python CSV parsing fills up memory
我有一个超过一百万行的CSV文件,我试图解析该文件并将行插入数据库。
with open(file, "rb") as csvfile:
re = csv.DictReader(csvfile)
for row in re:
//insert row['column_name'] into DB
对于2 MB以下的csv文件,它可以很好地工作,但除此之外,其他所有事情最终都会占用我的内存。 可能是因为我将Dictreader的内容存储在称为“ re”的列表中,并且它无法循环访问如此庞大的列表。 我绝对需要使用其列名访问csv文件,这就是为什么我选择dictreader的原因,因为它可以轻松提供对csv文件的列级访问。 谁能告诉我为什么会这样,如何避免呢?
DictReader
不会将整个文件加载到内存中,而是按照DhruvPathak建议的答案中的说明按块读取它。
但是,取决于您的数据库引擎,实际的磁盘写操作可能仅在提交时发生。 这意味着数据库(而不是csv读取器)将所有数据保留在内存中,并最终将其耗尽。
因此,您应该尝试提交每n
条记录,其中n
通常在10到1000之间,具体取决于行的大小和可用内存。
如果不需要一次使用全部列,则可以像处理文本文件一样简单地逐行读取文件并解析每一行。 确切的解析取决于您的数据格式,但是您可以执行以下操作:
delimiter = ','
with open(filename, 'r') as fil:
headers = fil.next()
headers = headers.strip().split(delimiter)
dic_headers = {hdr: headers.index(hdr) for hdr in headers}
for line in fil:
row = line.strip().split(delimiter)
## do something with row[dic_headers['column_name']]
这是一个非常简单的示例,但可能会更加详尽。 例如,如果您的数据包含,
则此方法无效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.