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 之间,具体取决于行的大小和可用内存。
我有一个超过一百万行的 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 之间,具体取决于行的大小和可用内存。