为什么pythonazure函数抛出错误代码为137的异常

2024-05-18 06:11:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个由blobtrigger触发的Azure函数。因此,基本上,每当有人将.csv上传到Azure blobstorage时,我都想清理、处理它,并将其插入sql数据库表中

当我在本地测试它时,它工作得非常好,但是在部署之后,我得到了如下错误:执行function:Functions时异常。BlobTrigger1 python退出,代码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)

Tags: columnsintruedfforsqlindexnp
1条回答
网友
1楼 · 发布于 2024-05-18 06:11:49

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

看看service limits in Microsoft Documentation基于你在函数应用程序中选择的计划,我假设你使用了消费计划

现在要检查它是否是超时问题,因为它提到了137个错误代码,请在执行函数应用程序时关注应用程序洞察日志

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

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

  2. 增加默认超时

下面是我们如何修改默认超时。默认情况下,它将为5分钟,我们可以相应地增加它以进行检查

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

检查documentation中的函数超时设置

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

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

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

相关问题 更多 >