2012-01-11 3 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, случайно? –

ответ

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 работает ?.)

Чтобы устранить эту проблему, установите отлаживать значение False.

Если вам необходимо очистить список запросов вручную в любой момент в ваших функциях, просто вызовите reset_queries(), например:

from django import db 
db.reset_queries() 
3

SQLite является базой данных в оперативной памяти. Он хранится на вашем жестком диске для потомков, но он полностью загружен в память для взаимодействия с ним. Это означает, что он по своей сути ограничен ресурсами памяти вашей системы. Он никогда не был предназначен для полноценного решения базы данных, а скорее для быстрой базы данных для обработки данных, для которых более крупные решения для баз данных, такие как PostgreSQL и MySQL, были бы излишними. Это также отлично подходит для сред разработки, где он прост в использовании, как правило, предварительно установлен и вполне достаточен для объема данных, используемых при разработке и тестировании. Однако, как производственная база, вы были бы безумны, чтобы использовать ее.

Однако, даже если вы находитесь в разработке, если вы имеете дело с «миллионами записей», вы официально переросли SQLite.