2012-01-11 59 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。