當前位置:成語大全網 - 書法字典 - Python:如何打破內存錯誤

Python:如何打破內存錯誤

要破解這個東西,妳得先破解妳的算法。先不要打破這個詞。

整理妳的算法,避免三重循環,避免字典的多重嵌套。

顯然,妳的數據是巨大的。還在用這樣消耗內存和CPU的算法。只有改進算法才能解決這個問題。即使我用C語言給妳編程,妳也可能耗盡內存。如果把矩陣放在字典裏,內存肯定會太多。對了,妳的python應該是32位的。如果是64位就更好了。

在python中,大數據處理必須減少字典的使用。如果字典條目超過2萬的某個值比,就要小心了。字典主要是用來統計的,不是用來計算的。建議妳考慮做。不想用可以用Array,還不想用可以用blist(第三方包),最不濟也要用list。雖然字典搜索比列表快,但它消耗更多內存。

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

第壹步是計算“每個條目的訪問人數”,可以用在字典裏。但因為人和事的聯系,應該是錯的。應該是“統計壹個已經瀏覽過的條目”。

妳的位置與時間無關。該算法不應計算“時間”權重。

我理解妳的算法應該是“當用戶瀏覽兩項時”,那麽兩項同時瀏覽的次數是累加的。

並且除以次數,用戶分別瀏覽I次和J次的乘積的平方根。這本來是壹個很簡單的算法。妳把它弄得太復雜了。

我建議妳這樣做。妳分別使用兩本字典。

items _ browsed _ by _ user[用戶標識][產品標識]

items _ browsed _ cross[userid][[產品id_i,產品id_j]]

在給items _ browsed _ cross[userid][(product _ id _ I,product _ id _ j)]賦值時請記住。請確保product _ id _ I

所以妳只需要壹半的內存來存儲i*j矩陣。因為先瀏覽I,再瀏覽J和J先瀏覽I,結果是壹樣的。

理想的方法是為userid寫壹個數字,從0到用戶數,這樣就可以直接存儲在數組中。不需要字典。用序列號替換product_id號。這樣占用的內存更少。只需要壹個二維數組來存儲數據。

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

如果不夠,也沒關系。壹次只計算壹行。然後存儲在硬盤上。分別按行和列計算。這在大數據環境中很容易做到。