2017-02-01 13 views
0

背景: 私は膨大なファイル.txtを処理する必要があります。それはdata miningプロジェクトです。 だから私は各1つの100MBサイズをファイル多くの.txtにそれを分割してきましたが、同じディレクトリにそれらをすべて保存し、それらをこのように実行するために管理:プロセスでPython - マルチプロセッシングとテキストファイルの処理

from multiprocessing.dummy import Pool

for filename in os.listdir(pathToFile): 
    if filename.endswith(".txt"): 
     process(filename) 
    else: 
     continue 

を、私は、ファイルを解析しますオブジェクトのリストに追加し、次に別の関数を適用します。これは、そのままファイル全体を実行するよりも遅いです。しかし、十分な大きさのファイルでは、すぐに実行することができず、スライスする必要があります。だから私は各process(filename)が完了するのを待つ必要がないのでスレッドを持っていたい。私はそれを適用するにはどうすればよい

?私はthisをチェックしましたが、私は任意の助けをいただければ幸いしてください

...私のコードにそれを適用する方法を理解していませんでした。 私はこれを行う方法を確認するためにhereを見ました。私が試した:

pool = Pool(6) 
for x in range(6): 
    futures.append(pool.apply_async(process, filename)) 

は、残念ながら、私はそれが唯一の最初の6つのテキストファイルを行います実現し、またはそうではないだろうか?どうすればそれを動作させることができますか?スレッドが終了するとすぐに別のファイルテキストを割り当てて実行を開始します。

EDIT:

for filename in os.listdir(pathToFile): 
    if filename.endswith(".txt"): 
     for x in range(6): 
      pool.apply_async(process(filename)) 
    else: 
     continue 
+0

は、ループ内のすべてのファイル名を渡します。 6は、6つのファイルが同時に処理されることを意味します。しかし、PythonのGILとスレッドのためにスピードを上げることはできません。代わりにマルチプロセッシングを見てください。 –

+0

あなたはスレッドプールまたはプロセスプールについて話していますか? – roganjosh

+0

@roganjosh、それは同じプログラムなのでスレッドでなければならないのですか? –

答えて

2

まず、使用してmultiprocessing.dummyあなたの問題は、処理(CPU集中型のタスクのために、(ファイルを読み込む際には、メインボトルネックである)が結合IOである場合のみ、あなたの速度増加を与えますファイルがボトルネックです)、それは助けにならないでしょう。その場合は、 "本当の" multiprocessingを使うべきです。

あなたが記述問題はPoolmap機能のうちの1つを使用するための、よりフィット感のようだ:

from multiprocessing import Pool 
files = [f for f in os.listdir(pathToFile) if f.endswith(".txt")] 
pool = Pool(6) 
results = pool.map(process, files) 
pool.close() 

これは、ファイルのリストを処理するために、6つのワーカープロセスを使用すると、戻り値のリストを返します。すべてのファイルが処理された後、process()関数のあなたの現在の例では、同じファイル6回を提出します。

+0

ニース、簡単な答え。結果にアクセスするために 'close()'と 'join()'する必要はありませんか? – roganjosh

+0

私はファイルのリストを持っていません。私は、特定のフォルダ内のすべての '.txt'ファイルにアクセスするために' fors.info in os.list ... 'を使用しています。 –

+0

@roganjosh no 'map()'を使用するときに 'join()'を使用する必要はありません。なぜなら、すべてのワーカーがすでにタスクを完了したことを返すからです。 'close()'を呼び出すことで、作業者は終了することができます。これはヒントのための良い習慣です。 – mata

関連する問題