2016-10-19 5 views
2

私は、何百万ものテキストファイルで大規模なテキスト処理ジョブを準備するために、dask.bagのいくつかのテストを試しています。現在、数十から数十万のテキストファイルのテストセットで、私はdaskがまっすぐなシングルスレッドのテキスト処理機能よりも5〜6倍遅くなっているのを見ています。Pythonのパフォーマンスが遅いDaskバッグ?

誰かが大量のテキストファイルに対してdaskを実行することによるスピード上の利点をどこから説明できますか?高速化が始まる前に何個のファイルを処理する必要がありますか? 150,000の小さなテキストファイルは少なすぎますか?ファイルを処理する際にdaskを高速化するには、どのようなパフォーマンスパラメータを調整する必要がありますか?ストレートシングルスレッドテキスト処理に比べてパフォーマンスが5倍低下することはありますか?

ここでは、dask outをテストするために使用しているコードの例を示します。これは、に位置ロイターからのデータのテスト・セットに対して実行されている:

http://www.daviddlewis.com/resources/testcollections/reuters21578/

このデータは、私が不利に働いていたデータと全く同じではありません。それ以外の場合は、個々のテキストファイルが1つのファイルにまとめられていますが、パフォーマンスの低下はほぼ同じです。ここでは、コードがあります:ここでは

import dask.bag as db 
from collections import Counter 
import string 
import glob 
import datetime 

my_files = "./reuters/*.ascii" 

def single_threaded_text_processor(): 
    c = Counter() 
    for my_file in glob.glob(my_files): 
     with open(my_file, "r") as f: 
      d = f.read() 
      c.update(d.split()) 
    return(c) 

start = datetime.datetime.now() 
print(single_threaded_text_processor().most_common(5)) 
print(str(datetime.datetime.now() - start)) 

start = datetime.datetime.now() 
b = db.read_text(my_files) 
wordcount = b.str.split().concat().frequencies().topk(5, lambda x: x[1]) 
print(str([w for w in wordcount])) 
print(str(datetime.datetime.now() - start)) 

は私の結果だった:

[('the', 119848), ('of', 72357), ('to', 68642), ('and', 53439), ('in', 49990)] 
0:00:02.958721 
[(u'the', 119848), (u'of', 72357), (u'to', 68642), (u'and', 53439), (u'in', 49990)] 
0:00:17.877077 

答えて

0

DASKは、タスクごとにおよそ1msのオーバーヘッドの費用について負担します。既定では、dask.bag.read_text関数はファイル名ごとに1つのタスクを作成します。私はあなたがただの頭上に濡れていると思う。

解決策はおそらく、1つのタスクで複数のファイルを処理することです。 read_text関数ではこれを行うオプションはありませんが、dask.delayedに切り替えることができます。これにより、柔軟性が少し向上し、後でdask.bagに変換されます。

関連する問題