整理妳的算法,避免三重循環,避免字典的多重嵌套。
顯然,妳的數據是巨大的。還在用這樣消耗內存和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號。這樣占用的內存更少。只需要壹個二維數組來存儲數據。
如果內存不夠,就要引入稀疏矩陣。
如果不夠,也沒關系。壹次只計算壹行。然後存儲在硬盤上。分別按行和列計算。這在大數據環境中很容易做到。