繁体   English   中英

Python CSV解析会填满内存

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM