2014-12-07 103 views
0

我需要幫助減少這個python腳本的內存使用:在Django/Python中優化內存使用情況?

tempproducts = TempProducts.objects.filter() 

for url in tempproducts: 
    scrap_and_save_product(url.url,True,0) 

scrap_and_save_product是一個函數,它下腳料數據與BeautifulSoup和數據庫保存它.. TempProducts有大約數十萬件產品

每30分鐘

220.059 MB 
271.594 MB 
313.316 MB 
355.492 MB 
373.516 MB 
402.266 MB 
437.328 MB 
470.746 MB 
507.195 MB 
543.059 MB 
574.215 MB 
614.906 MB 
643.902 MB 
742.559 MB 
787.93 MB 
823.988 MB 
856.949 MB 
896.645 MB 
931.93 MB 
964.68 MB 
:約50 MB

RAM使用日誌RAM使用率增加

我怎樣才能確切地檢查哪個數據結構需要我的RAM?我如何在Python/Django中減少內存使用量? ...更好地使用元組或列表?

回答

2
  1. 您應該向我們顯示scrap_and_save_product函數的代碼。
  2. 嘗試使用大數據進行更高效的內存查詢。詳細描述here。希望這些幫助!
+0

Unfortunality,我不能告訴你,因爲它是私有代碼 – blaz1988 2014-12-07 15:43:29

+1

我會嘗試從提示您鏈接 – blaz1988 2014-12-07 18:15:08

0

使用tempproducts=TempProducts.objects.filter().values('url')

從任何你在代碼中所顯示的,你只需要在數據庫URL。相反,您正在獲取存儲在表中的所有內容,並最終保存在RAM中。

查詢:tempproducts=TempProducts.objects.filter()轉換爲類似:

SELECT * from tempproducts_table; 

temproducts = TemProducts.objects.filter().values('url',)翻譯爲:

SELECT url from tempproducts_table; 
+0

THX ..我會嘗試這一點,並讓你知道的RAM使用降低.. – blaz1988 2014-12-07 15:44:27

+0

任何人有任何提示如何降低RAM使用一般.. – blaz1988 2014-12-07 15:45:32

0

使用iterator()。但不要忘記它不會緩存結果。

對於一個QuerySet返回大量的,你只需要 訪問一次,這可能會導致更好的性能和內存中的 顯著減少的對象。

2

確保在您的設置中有DEBUG = False。如果此設置爲true,則會保留SQL結果以進行調試。

+0

我將DEBUG設置爲false,現在我的RAM不增加「」「t也很重要,要記住,在DEBUG運行時,Django會記住它執行的每個SQL查詢。 ,但在生產服務器上,它將快速消耗內存。「」「 – blaz1988 2014-12-07 20:48:58