2016-10-19 2 views
2

저는 수백만 개의 텍스트 파일에서 큰 텍스트 처리 작업을 준비하기 위해 dask.bag의 일부 테스트를 시도하고 있습니다. 현재 수십에서 수십만 개의 텍스트 파일로 이루어진 테스트 세트에서 dask가 직선 단일 스레드 텍스트 처리 기능보다 5 ~ 6 배 더 느리게 실행되는 것을 볼 수 있습니다.Python Dask bag으로 느린 성능?

대용량 텍스트 파일에서 dask를 실행할 때의 속도상의 이점을 어디에서 설명 할 수 있습니까? 얼마나 빨리 처리되기 전에 몇 개의 파일을 처리해야합니까? 150,000 개의 작은 텍스트 파일이 너무 적습니까? 파일을 처리 할 때 속도 향상을 위해 어떤 종류의 성능 매개 변수를 조정해야합니까? 직선 단일 스레드 텍스트 처리보다 성능이 5 배나 떨어지는 이유는 무엇입니까?

다음은 dask out을 테스트하는 데 사용하는 코드의 예입니다. 이것은에있는 로이터 데이터의 테스트 세트에 대해 실행 :

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

이 데이터는 정확히 내가에 대한 일하고 있어요 데이터와 동일하지 않습니다. 다른 경우에는 개별 텍스트 파일, 파일 당 하나의 문서 묶음이지만 성능 저하는 거의 같습니다. 여기에 코드입니다 :

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)) 

여기 내 결과가 있었다 : DASK이 작업에 약 1ms의 오버 헤드 비용에 대해 초래

[('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.bag.read_text 함수는 파일 이름 하나당 하나의 작업을 만듭니다. 나는 당신이 단지 머리 위로 쓰러졌다 고 생각합니다.

여기 해결책은 하나의 작업에서 여러 파일을 처리하는 것입니다. read_text 함수는이 작업을 수행 할 수있는 옵션을 제공하지 않지만 조금 더 유연성이있는 dask.delayed으로 전환 한 다음 나중에 선호하는 경우 dask.bag로 변환 할 수 있습니다.