Python でのマルチスレッド処理を理解しようとしています。単語数、テキストの行数を計算し、各単語の数で辞書を作成する作業コードがあります。コードのコメントに記載されているような小さなファイルで高速に実行されます。ただし、通常は glob を使用して複数のファイルを取り込みます。私がそうすると、実行時間が大幅に増加しました。一方、私のスクリプトはシングル スレッドだったので、他の 3 つのコアがアイドル状態にあり、1 つが限界に達していることがわかります。
私はpythons multithreadingモジュールを試してみようと思った.
#!/bin/python
#
# test file: http://www.gutenberg.org/ebooks/2852.txt.utf-8
import fileinput
from collections import defaultdict
import threading
import time
inputfilename = 'pg2852.txt'
exitFlag = 0
line = []
line_counter = 0
tot_words = 0
word_dict = defaultdict(int)
def myCounters( threadName, delay):
for line in fileinput.input([inputfilename]):
line = line.strip();
if not line: continue
words = line.split()
tot_words += len(words)
line_counter += 1
for word in words:
word_dict[word] += 1
print "%s: %s:" %( threadName, time.ctime(time.time()) )
print word_dict
print "Total Words: ", tot_words
print "Total Lines: ", line_counter
try:
thread.start_new_thread( myCounters, ("Thread-1", 2, ) )
thread.start_new_thread( myCounters, ("Thread-2", 4, ) )
except:
print "Error: Thread Not Started"
while 1:
pass
このコードを試してみても、うまくいきません。入力ファイルをチャンクに分割し、何らかの方法で出力をマージする必要があると思います。? マップ/リデュース? おそらくもっと簡単な解決策がありますか?
編集:
たぶん次のようなもの:
- ファイルを開き、
- それをチャンクに分割します
- 各チャンクを異なるスレッドにフィードする
- カウントを取得し、各チャンクで辞書を作成します
- マージ数 / dict
- 結果を返す