2014-12-07 55 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