我現在基于probalisticlatentsemanticindexing(plsa)做圖像檢索,我的方法和這篇論文很像,需要計算一個條件概率p(z|w,v,d),我直接定義成了“doublepzdwtwv[][][][];”簡單地說,z是主題,w是英文單詞,v是視覺單詞,d是文檔,大小分別為12100500*7000,就是12個主題,100個英文單詞,500個視覺單詞,7000個文檔,double型的話算下來大概32G,其中z和d的數目是確定的,每個d的w和v的數目是不確定的。因為數組不能全部放進內存,所以把它放進數據庫中,我的數據庫是這樣設計的,把四維數組拆成二維數組,每次讀或寫一個二維數組。我使用了40個線程跑算法,數據庫中在collection中每個鍵對應的值是一個二維數組,每次計算完這個二維數組后就寫入數據庫,我的方法是這樣的:publicsynchronizedvoidupdate(intd,intt,double[][][]topic_pro){if(ifTrainset)mongo.update(true,(d+1)*100+t,topic_pro[t]);elsemongo.update(false,(d+1)*100+t,topic_pro[t]);}pzdwtwv和pzdwtwv_test是不同的collection。mongo.update方法是這樣的:publicvoidupdate(booleanifTrainset,intkey,double[][]new_value){BasicDBObjectquery=newBasicDBObject().append("key",key);BasicDBObjectupdated_element=newBasicDBObject();updated_element.append("$set",newBasicDBObject().append("value",new_value));if(ifTrainset){p_z_d_wt_wv.update(query,updated_element,true,false);}else{p_z_d_wt_wv_test.update(query,updated_element,true,false);}}另外,運行程序的時候,cpu利用率很低,大概7%~8%左右,但是內存幾乎達到100%。請問這個怎么解決
java 多線程訪問mongodb速度和單線程差不多
胡子哥哥
2019-04-07 09:38:24