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 文件,这很好用,但超过 2 MB 的文件最终会占用我的内存。这可能是因为我将 Dictreader 的内容存储在一个名为 "re" 的列表中,并且它无法遍历这么大的列表。我绝对需要访问带有列名的 csv 文件,这就是我选择 dictreader 的原因,因为它可以轻松地提供对我的 csv 文件的列级访问。谁能告诉我为什么会发生这种情况以及如何避免这种情况?

如果您不需要一次查看所有列,您可以像读取文本文件一样简单地逐行读取文件并解析每一行。确切的解析取决于您的数据格式,但您可以执行以下操作:

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

这是一个非常简单的示例,但可以更详细地说明。例如,如果您的数据包含 ,.

,这将不起作用

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

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

所以你应该尝试提交每 n 条记录,n 通常在 10 到 1000 之间,具体取决于行的大小和可用内存。