带有django的MemoryError

时间:2012-01-11 08:25:09

标签: django

我有一个django应用程序,它将大量数据加载到sqlite3数据库文件中 我们谈论的是数百万个条目,在一个函数中输入,在执行的某个时刻抛出:

  File "/root/codebase/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/transaction.py", line 219, in inner
    self.__exit__(*sys.exc_info())
  File "/root/codebase/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/transaction.py", line 207, in __exit__
    self.exiting(exc_value, self.using)
  File "/root/codebase/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/transaction.py", line 286, in exiting
    leave_transaction_management(using=using)
  File "/root/codebase/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/transaction.py", line 56, in leave_transaction_management
    connection.leave_transaction_management()
  File "/root/codebase/lib/python2.6/site-packages/Django-1.3.1-py2.6.egg/django/db/backends/__init__.py", line 114, in leave_transaction_management
    self.rollback()
MemoryError

我检查了我的功能并且它没有泄漏内存。还有什么可以在这里完成的?

3 个答案:

答案 0 :(得分:5)

https://docs.djangoproject.com/en/dev/faq/models/#why-is-django-leaking-memory

不知道Django会泄漏内存。如果您发现Django进程正在分配越来越多的内存,而没有释放它的迹象,请检查以确保您的DEBUG设置设置为False。如果DEBUG为True,则Django会保存它已执行的每个SQL语句的副本。

(查询保存在django.db.connection.queries中。请参阅如何查看Django正在运行的原始SQL查询?)

要解决此问题,请将DEBUG设置为False。

如果您需要在函数中的任何位置手动清除查询列表,只需调用reset_queries(),如下所示:

from django import db
db.reset_queries()

答案 1 :(得分:4)

SQLite是一个内存数据库。它存储在您的硬盘驱动器上以供后代使用,但它会完全加载到内存中以与之交互。这意味着它本身就受到系统内存资源的限制。它从来没有被设计成一个成熟的数据库解决方案,而是一个快速的数据库来处理数据,对于这些数据,像PostgreSQL和MySQL这样的大型数据库解决方案将是过度的。它也适用于开发环境,它易于使用,通常是预安装的,并且完全足以满足开发和测试中使用的数据量。但是,作为一个生产数据库,你会疯狂地使用它。

但是,即使您刚刚开发,如果您正在处理“数百万条目”,那么您已经正式超越了SQLite。

答案 2 :(得分:2)

该函数可能不是,但如果您使用如此庞大的数据库进行实现,则sqlite库可能会使用它来更新表。如果你需要存储如此大量的数据,你可能不得不从SQLite转移到一个功能齐全的数据库服务器,如MySQL。