當前位置:成語大全網 - 新華字典 - Python:MemoryError

Python:MemoryError

要破這個東西,要先破妳的算法。 先別說破這個詞了。

梳理妳的算法,避免三重循環, 避免大量使用字典的多次嵌套。

顯然妳的數據量巨大。還用這麽耗內存,耗CPU的算法。只有算法改良了才能解決這個問題。即使給妳C語編程,妳都能把內存用光了。妳把矩陣放在字典裏,內存肯定吃不消。順便說壹下,妳用的python應該是32位的。如果是64位的會好些。

在python裏,大數據處理壹定要減少字典使用。如果字典項超過壹定值比為2萬,就要小心。 字典主要是用來統計用,不用來計算。 建議妳考慮numpy.array做。如果不想用它就用Array,如果還不想可以用blist(第三方包),最差也要用list。字典雖然查找比list快,但是它耗更多內存。

比如妳這個問題,妳可以先考慮兩步走。不要把算法放在壹起,雖然效率高,但是後期維護成本高。

第壹步計算“瀏覽過每種物品的人數”, 這個可以用字典。但是因為要做人與物品的關聯,所以,應該是說錯了。 應該是“計算某個瀏覽過某個物品”。

妳這裏與時間沒有關系。算法應該沒有計算“時間”加權。

我理解妳的算法應該是用戶瀏覽”兩個物品時”,則累加兩個物品同時瀏覽次數。

並將次數除以,用戶分別瀏覽i,j次數乘積的開根方。 這本來是壹個很簡單的算法。 妳弄太復雜了。

建議妳這樣。 妳使用兩個字典,分別這樣

items_browsed_by_user[userid][product_id]

items_browsed_cross [userid][[product_id_i, product_id_j]]

記著在給items_browsed_cross [userid][(product_id_i, product_id_j)]賦值時。保證product_id_i < product_id_j

這樣妳只需要壹半的內存就可以存i*j矩陣。因為先瀏覽i, 再j和先j再i, 結果是壹樣的。

最理想的辦法是給userid編寫壹個編號,從0到number of users, 這樣直接用數組就可以存放。不需要字典。 再給product_id編號用順序號代替。 這樣內存占用更少。只需要壹個二維數組就可以存貯數據。

如果內存還不足夠,就要引入稀疏矩陣。

如果還不足夠,也可以的。每次計算,只計算壹行。然後存貯到硬盤上。按行按列分別計算。這在大數據環境裏很容易就做到了。