为什么我的 python azure 函数会抛出错误代码为 137 的异常

Why does my python azure function throw an exception with error code 137

我有一个由 blobtrigger 触发的 Azure 函数。所以基本上任何时候有人将 .csv 上传到 Azure blobstorage 我想清理它,处理它,然后将它插入到 sql 数据库 table.

当我在本地测试它时,它运行得非常好,但在部署之后,我收到如下错误:Exception while executing function: Functions.BlobTrigger1 python exited with code 137

我了解到当我的函数消耗过多内存时通常会抛出此异常,但我正在使用只有 26.16 MiB 的 .csv。这是我的代码

    blobBinaryDataStream = BytesIO(myblob.read())
    records = [r.decode('utf-8').split(',') for r in blobBinaryDataStream]
    arr = np.array(records)
    df = pd.DataFrame(arr[1:], columns=[name.replace('\r\n', '') for name in records[0]])
    df = df.replace('\r\n', '')
    del arr
    locationDF = df.iloc[: , [0, 1, 2, 46, 47, 48, 49, 50, 51, 58, 59, 60]].copy()
    locationDF.drop_duplicates(inplace=True)
    df.drop(df.columns.difference(df.columns[i] for i in [0, 3, 5, 8, 25, 35, 36]), axis = 1, inplace=True)
    df['date'] = df['date'].transform(lambda x: SomeFunction(x))
    df = df.replace('', 0)
    factdf = df.groupby([df.columns[0],df.columns[1]])[df.columns[2:]].apply(lambda x : x.astype(np.longlong).sum()).reset_index()
    
    quoted = urllib.parse.quote_plus(os.environ['ConnString'])
    engine = create_engine('mssql+pyodbc:///?odbc_connect={}'.format(quoted))

    locationDF.reset_index(drop=True, inplace=True)
    locationDF.index = locationDF.index + 1
    locationDF = locationDF.replace('', np.nan)
    locationDF.to_sql('Table1', schema='dbo', con=engine, if_exists='replace', method = 'multi', chunksize = 100)

    factdf.reset_index(drop=True, inplace=True)
    factdf.index = factdf.index + 1
    factdf.replace('', np.nan)
    factdf.to_sql('Table2', schema='dbo', con=engine, if_exists='replace', method = 'multi', chunksize = 100)

FunctionApp 退出,错误代码为 137,这是由 Python 函数应用程序中的内存不足问题引起的。

根据您在函数应用中选择的计划查看service limits in Microsoft Documentation,我假设您使用了消费计划。

现在检查是否是超时问题,因为它提到了137错误代码,请在执行函数应用程序时注意Application Insights日志。

如果您在错误中发现“00:05:00 的超时值被函数超出”之类的内容,请尝试调查以下几点:

  1. 检查为什么代码执行需要更多时间,如果您发现任何此类情况,我们可以从代码本身修复它。

  2. 增加默认超时。

下面是我们如何修改默认超时。默认为5分钟,我们可以相应增加查看。

{
    "functionTimeout": "00:05:00"
}

检查documentation函数超时设置

functionTimeout 表示所有函数的超时时间,而不是单个函数的超时时间。

您可以更新默认超时值,保存它,然后再次测试您的功能。

另请参阅有关 Memory profiling on Python function apps 的文档,以了解有关在我们的函数中管理内存的更多信息。