2016-10-19 5 views
2

Ich probiere einige Tests von dask.bag aus, um mich auf einen großen Textverarbeitungsprozess über Millionen von Textdateien vorzubereiten. Gerade jetzt, auf meinen Testsätzen von Dutzenden bis Hunderttausenden von Textdateien, sehe ich, dass dask etwa 5 bis 6 mal langsamer läuft als eine direkte Textverarbeitungsfunktion mit nur einem einzigen Text.Langsame Leistung mit Python-Dies-Tasche?

Kann mir jemand erklären, wo ich die Geschwindigkeitsvorteile durch das Ausführen von DASK über eine große Anzahl von Textdateien sehen kann? Wie viele Dateien müsste ich verarbeiten, bevor es schneller wird? Sind 150.000 kleine Textdateien einfach zu wenig? Welche Art von Leistungsparametern sollte ich optimieren, um das zu beschleunigen, wenn Dateien verarbeitet werden? Was könnte eine 5-fache Leistungseinbuße gegenüber der reinen Textverarbeitung mit nur einem einzigen Text bedeuten?

Hier ist ein Beispiel für den Code, den ich verwende, um dies zu testen. Dies läuft gegen einen Testsatz von Daten von Reuters sich unter:

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

Diese Daten sind nicht genau das gleiche wie die Daten gegen ich arbeite. In meinem anderen Fall ist es eine Reihe von einzelnen Textdateien, ein Dokument pro Datei, aber der Leistungsabfall, den ich sehe, ist ungefähr derselbe. Hier ist der Code:

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

Hier waren meine Ergebnisse:

[('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 

Antwort

0

Dask entstehen zu einem Preis von etwa 1 ms Aufwand pro Aufgabe. Standardmäßig erstellt die Funktion dask.bag.read_text eine Aufgabe pro Dateiname. Ich vermute, dass Sie nur von Overhead überschwemmt werden.

Die Lösung hier ist wahrscheinlich mehrere Dateien in einer Aufgabe zu verarbeiten. Die read_text-Funktion bietet keine Optionen dafür, aber Sie könnten zu dask.delayed wechseln, die ein bisschen mehr Flexibilität bietet und später zu einem dask.bag konvertieren, wenn Sie es bevorzugen.

Verwandte Themen