pythonmemoryerror
⑴ python實現協同過濾推薦演算法,用的大一些的數據集就報錯MemoryError
python雖然易用,但是內存佔用比較多;所以如果你有C/C++/Java基礎,考慮用這些語言來實現;
CF演算法需要計算大量的相似度,如果能把中間結果存起來,或者簡化計算過程(如,你可能會重復計算一個item的均值)可以省下不少內存;(個人試過計算1w個用戶Pearson是沒問題的)
如果內存實在不夠用,那就用時間換空間,把中間計算結果分成小文件存到磁碟上,用的時候再讀取。
供參考。
⑵ Python:MemoryError
要破這個東西,要先破你的演算法。 先別說破這個詞了。
梳理你的演算法,避免三重循環, 避免大量使用字典的多次嵌套。
顯然你的數據量巨大。還用這么耗內存,耗CPU的演算法。只有演算法改良了才能解決這個問題。即使給你C語編程,你都能把內存用光了。你把矩陣放在字典里,內存肯定吃不消。順便說一下,你用的python應該是32位的。如果是64位的會好些。
在python里,大數據處理一定要減少字典使用。如果字典項超過一定值比為2萬,就要小心。 字典主要是用來統計用,不用來計算。 建議你考慮numpy.array做。如果不想用它就用Array,如果還不想可以用blist(第三方包),最差也要用list。字典雖然查找比list快,但是它耗更多內存。
比如你這個問題,你可以先考慮兩步走。不要把演算法放在一起,雖然效率高,但是後期維護成本高。
第一步計算「瀏覽過每種物品的人數」, 這個可以用字典。但是因為要做人與物品的關聯,所以,應該是說錯了。 應該是「計算某個瀏覽過某個物品」。
你這里與時間沒有關系。演算法應該沒有計算「時間」加權。
我理解你的演算法應該是用戶瀏覽」兩個物品時」,則累加兩個物品同時瀏覽次數。
並將次數除以,用戶分別瀏覽i,j次數乘積的開根方。 這本來是一個很簡單的演算法。 你弄太復雜了。
建議你這樣。 你使用兩個字典,分別這樣
items_browsed_by_user[userid][proct_id]
items_browsed_cross [userid][[proct_id_i, proct_id_j]]
記著在給items_browsed_cross [userid][(proct_id_i, proct_id_j)]賦值時。保證proct_id_i < proct_id_j
這樣你只需要一半的內存就可以存i*j矩陣。因為先瀏覽i, 再j和先j再i, 結果是一樣的。
最理想的辦法是給userid編寫一個編號,從0到number of users, 這樣直接用數組就可以存放。不需要字典。 再給proct_id編號用順序號代替。 這樣內存佔用更少。只需要一個二維數組就可以存貯數據。
如果內存還不足夠,就要引入稀疏矩陣。
如果還不足夠,也可以的。每次計算,只計算一行。然後存貯到硬碟上。按行按列分別計算。這在大數據環境里很容易就做到了。
⑶ 請問大神們Python處理數據遇到memory error怎麼辦
items=[[0,16],[0,34],[10,15],[10,28],[20,35],[20,58],[34,13],[34,18],[34,20]]
while1:
tmps=[(a,b)forainitemsforbinitemsifa[-1]==b[0]]
ifnottmps:
break
tmps2=[(a,b)foraintmpsforbintmpsifa[-1]==b[0]]
foriintmps2:
tmps.remove(i[1])
fora,bintmps:
items.append(a+b[1:])
ifainitems:
items.remove(a)
ifbinitems:
items.remove(b)
print(items)
你的代碼沒法看, 直接給你重寫了個。
如果items的元素能用元組表示的話,通過元組和集合,能更快點。
⑷ python 問題求解:memoryError的問題!
其實,解決這種問題的策略無非兩種策略:
1、換用內存更大的伺服器。
2、使用更大的物理空間來犧牲性能,你可以將中間結果或者臨時結果在計算進行到一定程度的時候存儲進入臨時文件,然後在使用到相應的數據時候再取用,當然這樣非常損失性能,當年我做生物信息學方面的時候遇到這樣的問題。只能用數以千計的臨時文件進行暫時緩存。
⑸ 如何在Python中解決MemoryError問題
通常不會遇到這個問題。python解決小問題不會有memory error
可能是使用了大對象也可能是使用了遞歸。沒有合適規劃臨時或者是堆棧數據的數量。
那麼有問題大部分是因為dict或者是list太大了。解決辦法是使用優化過的數據結構,比如blist,或者是直接使用numpy的數組,array數據結構等等。
解決辦法多。還可以使用64位版本。其實意義不大。python自己不需要管理大內存。也不需要大內存操作。
所以要用分布式架構解決問題。把問題分解成500MB以下的小問題,這樣即使是32位的python也可以輕松完成。
內存管理的事情還是交給 C, C++這樣的程序比較合適。2GB以下可以使用共享內存。 如果超過了,比如8,16, 96gb等。可以考慮使用資料庫去管理。
如果你一定要用大對象也沒有關系,其實效率也是挺高的。只是演算法要優化。
⑹ python出現MemoryError
要破這個東西,要先破你的演算法。 先別說破這個詞了。
梳理你的演算法,避免三重循環, 避免大量使用字典的多次嵌套。
顯然你的數據量巨大。還用這么耗內存,耗CPU的演算法。只有演算法改良了才能解決這個問題。即使給你C語編程,你都能把內存用光了。你把矩陣放在字典里,內存肯定吃不消。順便說一下,你用的python應該是32位的。如果是64位的會好些。
在python里,大數據處理一定要減少字典使用。如果字典項超過一定值比為2萬,就要小心。 字典主要是用來統計用,不用來計算。 建議你考慮numpy.array做。如果不想用它就用Array,如果還不想可以用blist(第三方包),最差也要用list。字典雖然查找比list快,但是它耗更多內存。
比如你這個問題,你可以先考慮兩步走。不要把演算法放在一起,雖然效率高,但是後期維護成本高。
第一步計算「瀏覽過每種物品的人數」, 這個可以用字典。但是因為要做人與物品的關聯,所以,應該是說錯了。 應該是「計算某個瀏覽過某個物品」。
你這里與時間沒有關系。演算法應該沒有計算「時間」加權。
我理解你的演算法應該是用戶瀏覽」兩個物品時」,則累加兩個物品同時瀏覽次數。
並將次數除以,用戶分別瀏覽i,j次數乘積的開根方。 這本來是一個很簡單的演算法。 你弄太復雜了。
建議你這樣。 你使用兩個字典,分別這樣
items_browsed_by_user[userid][proct_id]
items_browsed_cross [userid][[proct_id_i, proct_id_j]]
記著在給items_browsed_cross [userid][(proct_id_i, proct_id_j)]賦值時。保證proct_id_i < proct_id_j
這樣你只需要一半的內存就可以存i*j矩陣。因為先瀏覽i, 再j和先j再i, 結果是一樣的。
最理想的辦法是給userid編寫一個編號,從0到number of users, 這樣直接用數組就可以存放。不需要字典。 再給proct_id編號用順序號代替。 這樣內存佔用更少。只需要一個二維數組就可以存貯數據。
如果內存還不足夠,就要引入稀疏矩陣。
如果還不足夠,也可以的。每次計算,只計算一行。然後存貯到硬碟上。按行按列分別計算。這在大數據環境里很容易就做到了。