pythonerror32
① python安裝時,出現錯誤導致無法安裝是怎麼回事
1、Python這個東西04的win7上裝不了。08的32位的能裝,64位的也裝不了。
2、Python中設置標准錯了,Python中設置標准為無緩沖有以下三種方法:
(1) 對python加-u參數
(2) 加 PYTHONUNBUFFERED環境變數
(3) sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
我們採用第三種方法,添加 sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)到pyth.py中。再次運行client就可以啦。
② 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中解決MemoryError問題
通常不會遇到這個問題。python解決小問題不會有memory error
可能是使用了大對象也可能是使用了遞歸。沒有合適規劃臨時或者是堆棧數據的數量。
那麼有問題大部分是因為dict或者是list太大了。解決辦法是使用優化過的數據結構,比如blist,或者是直接使用numpy的數組,array數據結構等等。
解決辦法多。還可以使用64位版本。其實意義不大。python自己不需要管理大內存。也不需要大內存操作。
所以要用分布式架構解決問題。把問題分解成500MB以下的小問題,這樣即使是32位的python也可以輕松完成。
內存管理的事情還是交給 C, C++這樣的程序比較合適。2GB以下可以使用共享內存。 如果超過了,比如8,16, 96gb等。可以考慮使用資料庫去管理。
如果你一定要用大對象也沒有關系,其實效率也是挺高的。只是演算法要優化。