我有一个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
我检查了我的功能并且它没有泄漏内存。还有什么可以在这里完成的?
答案 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。