2012-01-11 58 views
1

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

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 

我检查了我的功能,并且它不泄漏内存。还有什么可以做的呢?

+2

您有任何机会将DEBUG设置为True吗? – 2012-01-11 10:04:32

回答

1

该函数可能不是,但如果你认为这样一个庞大的数据库,sqlite库可能会消耗它来更新表。如果您需要存储如此庞大的数据量,您可能不得不从SQLite迁移到全功能的数据库服务器(如MySQL)。

4
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,看我怎么能看到原始的SQL查询的Django运行?)

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

如果您需要手动清除查询列表在你的功能的任何一点,只需调用reset_queries(),像这样:

from django import db 
db.reset_queries() 
3

SQLite是一个内存数据库。它被存储在你的硬盘上作为后代,但它被全部加载到内存中以与其进行交互。这意味着它本身受到系统内存资源的限制。它从来没有被设计成一个成熟的数据库解决方案,而是一个快速处理数据的数据库,对于像PostgreSQL和MySQL这样的大型数据库解决方案,数据库解决方案会过度。对于开发环境来说,它也非常棒,它易于使用,通常预安装,并且完全可以满足开发和测试中使用的大量数据。不过,作为一个生产数据库,你会疯狂地使用它。然而,即使你刚刚开发,如果你正在处理“数百万条目”,你已经正式超越SQLite。