梳理妳的算法,避免三重循環, 避免大量使用字典的多次嵌套。
顯然妳的數據量巨大。還用這麽耗內存,耗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編號用順序號代替。 這樣內存占用更少。只需要壹個二維數組就可以存貯數據。
如果內存還不足夠,就要引入稀疏矩陣。
如果還不足夠,也可以的。每次計算,只計算壹行。然後存貯到硬盤上。按行按列分別計算。這在大數據環境裏很容易就做到了。