2016-12-08 5 views
-1

私はpython3.3を使用しています.20MBのファイルが10個あるディレクトリを読み込むために、スレッドプールエグゼキュータを最大10個のスレッドで使用して、読み込むファイルを送信しています。私は1Mbのチャンクを一度に読み込み、すべてのファイルの各行をスレッドセーフリストに保存しています。一番上のコマンドを見ると、CPU使用率はかなり高いです。任意の提案を100%上回り、CPU使用率を削減します。以下はスニペットです。CPU使用率を減らす

all_lines_list = [] 
while True: 
    with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: 
     for each_file in file_list: 
      executor.submit(trigger, each_file) 
def trigger(filename): 
    with open(filename, "r")as fp: 
     buff = fp.read(1000000) 
     buff_lines = buff.split('\n') 
    time.sleep(0.2) 
    for each_line in buff_lines: 
     all_lines_list.append(each_line) 
+2

「CPU使用率を減らすための提案」 - スレッド数を少なくする! –

+0

実際には、ディレクトリ内に100を超えるファイルが存在する可能性があります。そのため、いくつかの高速処理には10個のスレッドが必要です。 –

+0

あなたの質問に対するタイトルが「CPU使用率の向上」に関する「CPU使用率の増加」の理由は何ですか? – selbie

答えて

0

各スレッドはCPU時間を使用して処理を行います。 CPU使用率を下げるには、使用するスレッド数を減らします。

0

リストにextend方法を使用してみてください、代わりに100万を繰り返すが追加されます

all_lines_list.extend(buff_lines) 

代わりの

for each_line in buff_lines: 
    all_lines_list.append(each_line) 

をそれはあなたの作業負荷を軽減していない場合:あなたが動作するようにコンピュータを入れています - 10倍のデータ読み込みとメモリへの保存 - 作業が必要です - なぜ、1つのコアのすべての処理を行うのが心配ですか?それを20%に減らすと、5倍の時間で作業が完了します。内部には、文字を見つけるために、各バイトをデコードする必要がある場合がありますだけでなく、いくつかのCPUを使用する可能性があります -

あなたがのpython3でテキストとしてファイルをファイルを開くと、特定の文字数を読んでいることであり、別の問題を抱えています境界線や行区切り文字を使用することができます。
したがって、ファイルがutf-8のような可変長のテキストエンコーディングを使用していない場合、ファイルをバイナリモードで開き、後でデコードする価値があります可変長文字を処理してバイナリファイルとして読み込む戦略をとる価値があります)

もちろん、マルチプロの使用にも利点がありますスレッド化の代わりに処理を中止することで、プログラムは複数のCPUコアを使用してデータを処理します。しかし、Pythonにはネイティブのマルチプロセス共有リストオブジェクトがありません。multiprocess.Valuemultiprocess.Arrayオブジェクトを使用して、独自のデータ構造を作成し、ロックで安全に保つ必要があります。あなたはこのデータを処理するのではなく、それをリストに追加するために多くのことが必要なので、私はその努力に値するとは思わない。