2017-09-08 8 views
0

Ich mache etwas scheinbar trivial, das dauert viel länger als ich es erwarten würde. Ich lade eine 70-MB-Datei, führe sie durch einen Reduzierer, der ein Python-Skript aufruft, das die Daten nicht verändert, und schreibe die Daten in eine neue Datei zurück.U-SQL-Python-Erweiterung: sehr langsame Leistung

Es dauert 42 Minuten, wenn ich es durch das Python-Skript ausführen, dauert es weniger als eine Minute (einschließlich Kompilierung), wenn ich nicht mache.

Ich versuche zu verstehen:

  • Was mache ich falsch?

  • Was passiert unter der Haube, die so lange dauert?

Ich speichere die Eingabe- und Ausgabedateien auf Azure Data Lake Store. Ich verwende Parallelismus 1, eine TSV-Eingabedatei von etwa 70 MB (2000 Zeilen, 2 Spalten). Ich gebe nur die Daten weiter. Es dauert 42 Minuten, bis der Job beendet ist.

I erzeugen die Testeingangsdaten mit diesem Python-Skript:

import base64 

# create a roughly 70MB TSV file with 2000 rows and 2 columns: ID (integer) and roughly 30KB data (string) 
fo = open('testinput.tsv', 'wb') 
for i in range(2000): 
    fo.write(str(i).encode() + b'\t' + base64.b85encode(bytearray(os.urandom(30000))) + b'\n') 
fo.close() 

Dies ist der U-SQL-Skript Ich benutze:

REFERENCE ASSEMBLY [ExtPython]; 

DECLARE @myScript = @" 
def usqlml_main(df): 
    return df 
"; 

@step1 = 
EXTRACT 
    col1 string, 
    col2 string 
FROM "/test/testinput.tsv" USING Extractors.Tsv();; 

@step2 = 
REDUCE @ncsx_files ON col1 
PRODUCE col1 string, col2 string 
USING new Extension.Python.Reducer(pyScript:@myScript); 

OUTPUT @step2 
TO "/test/testoutput.csv" 
USING Outputters.Tsv(outputHeader: true); 

Antwort

1

Ich habe das gleiche Problem.

Ich habe eine 116 MB CSV-Datei, die ich einlesen möchte (und dann Zeug). Wenn ich versuche, die Datei einzulesen und nichts im Python-Skript zu tun, läuft die Zeit nach 5 Stunden ab, ich habe sogar versucht, die Datei auf 9,28 MB zu reduzieren.

Wenn jedoch auf 1,32 MB reduziert, endet der Auftrag nach 16 Minuten. (Mit Ergebnissen wie erwartet).

REFERENCE ASSEMBLY [ExtPython]; 

DECLARE @myScript = @" 
def usqlml_main(df): 
    return df 
"; 

@train = 
    EXTRACT txt string, 
      casegroup string 
    FROM "/test/t.csv" 
    USING Extractors.Csv(); 
@train = 
    SELECT *, 
     1 AS Order 
    FROM @train 
ORDER BY Order 
FETCH 10000; 

@train = 
    SELECT txt, 
     casegroup 
    FROM @train; // 1000 rows: 16 mins, 10000 rows: times out at 5 hours. 

@m = 
    REDUCE @train ON txt, casegroup 
    PRODUCE txt string, casegroup string 
    USING new Extension.Python.Reducer(pyScript:@myScript); 

OUTPUT @m 
TO "/test/t_res.csv" 
USING Outputters.Csv();