我做的事情似乎微不足道,花费的时间比我预期的要长得多。我正在加载一个70MB的文件,通过一个调用Python脚本的reducer运行它,该脚本不会修改数据,并将数据写回一个新文件。
当我通过Python脚本运行它需要42分钟,如果我不这样做,则需要不到一分钟(包括编译)。
我试图理解:
我做错了什么?
引擎盖下面发生了什么这么长时间?
我将输入和输出文件存储在Azure Data Lake Store上。我使用并行性1,一个大约70MB(2000行,2列)的TSV输入文件。我只是传递数据。工作结束需要42分钟。
我用这个Python脚本生成了测试输入数据:
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()
这是我使用的U-SQL脚本:
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);
答案 0 :(得分:1)
我有同样的问题。
我有一个116 MB的csv文件我想读(然后做东西)。当试图读取文件而在python脚本中什么都不做时它会在5小时后超时,我甚至尝试将文件减少到9,28 mb,它也会在5小时后超时。
然而,当减少到1,32 mb时,工作在16分钟后完成。 (结果如预期的那样)。
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();
答案 1 :(得分:1)
REDUCE @ROWSET ALL
如果不减少ALL,它将在每行调用python函数。
如果您要使用并行性,则可以创建临时组以减少并行化。