2017-08-18 5 views
0

ディレクトリにあるすべてのファイルをリストして読み込み、同時にファイルに存在するレコードの総数をカウントするプログラムがあります。Pythonのプールクラスを使用したテキストファイルレコード数

私は以下のコードを実行しているときに、複数のファイルからのレコードのカウントも並行しているので、カウントがチャンクになるワーカースレッド名のリストを取得します。私は

File1.Txt Total_Recordcount 
... 
Filen.txt Total_Recordcount 

UPDATE のようなファイルの合計記録数が、私は解決策を持って、貼り付け得ることができるように

import multiprocessing as mp 
import time 
import os 
path = '/home/vaibhav/Desktop/Input_python' 

def process_line(f): 
    print(mp.current_process()) 
    #print("process id = " , os.getpid(f)) 
    print(sum(1 for line in f)) 

for filename in os.listdir(path): 
    print(filename) 

    if __name__ == "__main__": 

     with open('/home/vaibhav/Desktop/Input_python/'+ filename, "r+") as source_file: 
      # chunk the work into batches 

      p = mp.Pool() 
      results = p.map(process_line, source_file) 

start_time = time.time() 
print("My program took", time.time() - start_time, "to run") 

電流出力

<ForkProcess(ForkPoolWorker-54, started daemon)> 
73 
<ForkProcess(ForkPoolWorker-55, started daemon)> 
<ForkProcess(ForkPoolWorker-56, started daemon)> 
<ForkProcess(ForkPoolWorker-53, started daemon)> 
73 
1 
<ForkProcess(ForkPoolWorker-53, started daemon)> 
79 
<ForkProcess(ForkPoolWorker-54, started daemon)> 
<ForkProcess(ForkPoolWorker-56, started daemon)> 
<ForkProcess(ForkPoolWorker-55, started daemon)> 
79 
77 
77 

は、道の周りにありますコメントセクションの答え。

答えて

0

私はファイルを読み込み、1つのファイルに対して複数のプロセスを生成していましたが、これはファイルのまとまりのレコード数を引き起こしていました。

今私は私のアプローチを変更しました。現在、リストのすべての異なるファイルに対して複数のプロセスをリリースし、より良い結果を提供するpool.map()関数に反復可能なファイルのリストを渡しています。実行時間のここにはlinkがあり、そこから私はrefrenceをとりました。下は貼り付けられ修正されたコードです。

import multiprocessing as mp 
from multiprocessing import Pool 
import os 
import time 
folder = '/home/vaibhav/Desktop/Input_python' 

fnames = (name for name in os.listdir(folder)) 
def file_wc(fname): 
    with open('/home/vaibhav/Desktop/Input_python/'+ fname) as f: 
     count = sum(1 for line in f) 
    return (fname,count) 
pool = Pool()  
print(dict(pool.map(file_wc, list(fnames)))) 
pool.close() 
pool.join() 
start_time = time.time() 
print("My program took", time.time() - start_time, "to run") 
0

テキストファイル内の行数をCPUでバインドするべきではないため、スレッド化には適していません。あなたは、複数の独立したファイルを処理するスレッドプールを使用する場合がありますが、単一のファイルのために、ここでは非常に高速である必要があります行をカウントする方法があります:

import pandas as pd 
data = pd.read_table(source_file, dtype='S1', header=None, usecols=[0]) 
count = len(data) 

これはありませんが、最初の文字(S1を解析することです)をDataFrameに挿入し、長さを確認します。パーサはC言語で実装されているため、Pythonループが遅くなる必要はありません。これは、ディスクサブシステムによってのみ制限される可能性のある最高の速度に近づける必要があります。

これは、ファイルごとに1つのカウントを取得するため、元の問題を完全に回避します。

+0

この場合、複数のファイルを同時に読み取るためにマルチプロセッシングモジュールを使用することはできませんか? – codaholic

+0

元のコードは一度に1つのファイルのみを処理しますが、正しいですか?一度に複数のファイルを処理したい場合は、 'pool.map(countlines、source_files)'のようにすることができます。つまり、各スレッドに一度に1つのファイルを与えます。これにより、プログラムが高速化するかどうかを予測することは困難です。これは、お使いのコンピュータによって異なります。 –

+0

私のプログラムは、一度に複数のファイルを処理しています。私はpool.map()を使用しています。アウトプットをチェックインすることもできます。複数のフォークプロセスも存在します。 – codaholic

関連する問題