【问题标题】:Python/Django - How to decrease memory usage when Importing CSV into Database?Python/Django - 将 CSV 导入数据库时​​如何减少内存使用?
【发布时间】:2013-10-26 16:48:05
【问题描述】:

这就是我正在做的:

reader = csv.reader(file)
fields = ["row_id","second_field","third_field",...]

for index, row in enumerate(reader):
    mapped_row = dict(zip(fields,row))

    DataEntry.objects.get_or_create(row_id=mapped_row["row_id"], defaults={
         second_field = mapped_row["second_field"],
         third_field = mapped_row["third_field"],
         ...
    })

内存爆炸得不成比例!

在超过 50000 行之后,系统已经在使用 4GB,然后开始在 HDD 上进行交换,并且 Python 不会释放未使用的内存。


我尝试在每一行添加以下内容,但无济于事

 del index
 del row
 del mapped_row

我正在使用 Python 2.7.5 和 Django 1.5。


知道发生了什么吗?

【问题讨论】:

  • 您是否尝试过使用缓冲区读取或读取/写入块,例如每次超过 10000 次?
  • @ManuParra 感谢您的建议!由于 CSV 阅读器是一个生成器,它不应该让块变得不必要吗?
  • 但是,你真的需要将所有数据都保存在内存中,因为你要存储对象 DataEntry。
  • 是python消耗了所有内存吗?你的数据库引擎是什么?

标签: python django csv memory-management memory-leaks


【解决方案1】:

看来您是在写入任何数据之前将所有数据读入字典。没有明显的理由这样做。尝试读取/写入不同大小的块(一次 1 行、10、100 等),看看哪个块大小提供了您喜欢的内存和速度性能。

【讨论】:

  • 我正在创建一个字典来抽象该过程的第二部分,因为row[45], row[23], row[127], ... 的可读性和可维护性都不是很好。我想 Python 应该在迭代后垃圾收集那个字典,del mapped_row 无论如何都应该解决这个问题。
  • CSV 阅读器作为生成器难道不能避免分块阅读吗?非常感谢你的帮助! :)
  • 主要问题是,没有理由在将所有数据写入数据库之前将所有数据读入字典——这样可以最大限度地利用内存。围绕块的问题是,取决于您的数据库连接的配置方式,一次写入一行可能会使整体操作比必要的慢。分块写入可以加快操作。最好尝试一下。
猜你喜欢
  • 1970-01-01
  • 2014-08-03
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
  • 2010-10-28
  • 2018-08-24
相关资源
最近更新 更多