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