タイトル通りです
pythonのmultiprocessingを利用して、並列処理を行っていますが
タスクマネージャを見ると、CPU使用率があまり上がっていません
CPUを最大限に使うようなコードを書いています
例えば
python
1p = Pool() 2p = Pool(multiprocessing.count()) 3p = Pool(8) #仮想コアが8のため
これらを試しましたが、CPUはあまり変化しません
コードに何か問題があるのか
他に何か考えられることはありますか?
python
1import nltk 2import numpy as np 3import json 4import nltk_exa as nl 5import time 6from multiprocessing import Pool 7#import multiprocessing 8import sys 9 10def subcalc(word): 11 subdoc = [] 12 lists = [] 13 collection = nltk.TextCollection(word) #サイトにのっていた 14 #uniqterms = list(set(collection)) #ここも上と同じサイトに載っていた 15 wo=[] 16 for term in set(word): 17 if(collection.tf_idf(term, word) > 0): 18 wo.append([term,collection.tf_idf(term, word)]) #ここも上のサイトにのってる 19 #print(wo) 20 wo.sort(key=lambda x:x[1]) #keyに無名関数lambdaをいれてる woの1番目の要素(WO(1,2)だったら”2”)でソート 21 wo.reverse() 22 try: 23 slice1 = np.array(wo[:20]) #先頭の文字から終了インデックスまでが抽出 24 lists = slice1[:,0] #[:]は戦闘から終了のインデックスまで抽出と、slice1の0番目を格納 25 subdoc.append(list(lists)) #listsが文字列だから、リストに格納 26 del wo 27 except: 28 print(wo) 29 return subdoc 30 31def tfidf(): 32 t1 = time.time() 33 doc0 = [] 34 doc = [] 35 word0 = [] 36 word = [] 37 f = open("/Users//Dropbox/prg/dataset/word0_notuseful012.txt") 38 for row in f: 39 word0.append(row.split("][")) 40 f.close() 41 for i in word0[0]: 42 word.append(str(i).replace("[","").replace("]","").replace(",","").replace("'","").replace("\"","").split()) 43 #word.pop() 44 ttt = time.time() 45 p = Pool(4) 46 #a = subcalc(word) #1コアによる実行 47 #print(a) 48 doc = p.map(subcalc, word) #複数コアによる実行 49 t3 = time.time() 50 #print(doc[0][0]) 51 #print('processing time(nltkはこんだけかかってる)(終わり): ' + str(ttt - tt) + '(sec)') 52 print('processing time2(終わり): ' + str(t3 - ttt) + '(sec)') 53 54if __name__ == "__main__": 55 tfidf()
ちなみにこのテキストファイルは30万行ほどのテキストファイルです
このときCPU使用率は40%ほどです
「CPUを最大限に使うようなコードじゃない」か「並列処理をしていない」かのどちらかだと思いますが。Poolを作っている部分だけじゃなにもわからないでしょう。使っている部分のソースがなければ誰も判断できないですよねね。
CPUを最大限に使うようなコードじゃないということもあるのですね、それを知ることができたのでよかったです、おそらくそれだと思うのですが、どうですか
30万行あっても最初の1行しか処理してないから実質1プロセスしか仕事していないように見えます。←訂正します。すみません。1行目がとても大きくて4件以上分のデータが入っているのなら問題ないのですがそういうことでしょうか。
あと、subcalcがTF-IDFを計算しているように見えないことも気になりました。これはTFだけ計算させているのでしょうか?
一行目に4件以上分のデータが入るというのはどういう状況でしょうか、ちなみに、タスクマネージャをみるとスレッドが増えているので複数プロセスで動いてそうです
TFIDFをやっているつもりです、ここが間違っているとちょっとつらいですね…
単にコードの転記間違いかと思ったのですが。

回答1件
あなたの回答
tips
プレビュー