我現(xiàn)在基于probalisticlatentsemanticindexing(plsa)做圖像檢索,我的方法和這篇論文很像,需要計(jì)算一個(gè)條件概率p(z|w,v,d),我直接定義成了“doublepzdwtwv[][][][];”簡(jiǎn)單地說(shuō),z是主題,w是英文單詞,v是視覺(jué)單詞,d是文檔,大小分別為12100500*7000,就是12個(gè)主題,100個(gè)英文單詞,500個(gè)視覺(jué)單詞,7000個(gè)文檔,double型的話算下來(lái)大概32G,其中z和d的數(shù)目是確定的,每個(gè)d的w和v的數(shù)目是不確定的。因?yàn)閿?shù)組不能全部放進(jìn)內(nèi)存,所以把它放進(jìn)數(shù)據(jù)庫(kù)中,我的數(shù)據(jù)庫(kù)是這樣設(shè)計(jì)的,把四維數(shù)組拆成二維數(shù)組,每次讀或?qū)懸粋€(gè)二維數(shù)組。我使用了40個(gè)線程跑算法,數(shù)據(jù)庫(kù)中在collection中每個(gè)鍵對(duì)應(yīng)的值是一個(gè)二維數(shù)組,每次計(jì)算完這個(gè)二維數(shù)組后就寫入數(shù)據(jù)庫(kù),我的方法是這樣的: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);}}另外,運(yùn)行程序的時(shí)候,cpu利用率很低,大概7%~8%左右,但是內(nèi)存幾乎達(dá)到100%。請(qǐng)問(wèn)這個(gè)怎么解決
java 多線程訪問(wèn)mongodb速度和單線程差不多
胡子哥哥
2019-04-07 09:38:24