Python CSV解析填充内存

时间:2015-04-23 06:14:10

标签: python csv 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文件的列级访问。任何人都可以告诉我为什么会这样,以及如何避免这种情况?

2 个答案:

答案 0 :(得分:4)

DictReader不会将整个文件加载到内存中,而是按照块读取,如DhruvPathak建议的this answer中所述。

但是根据您的数据库引擎,磁盘上的实际写入可能只发生在提交时。这意味着数据库(而不是csv阅读器)将所有数据保存在内存中并最终耗尽它。

因此,您应该尝试提交每个n条记录,n通常介于10和1000之间,具体取决于您的行数和可用内存。

答案 1 :(得分:1)

如果您不需要同时使用整个列,则可以像使用文本文件一样逐行读取文件并解析每一行。确切的解析取决于您的数据格式,但您可以执行以下操作:

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']]

这是一个非常简单的例子,但它可以更精细。例如,如果您的数据包含,,则无法使用此功能。