首页 > 解决方案 > Scipy wavfile 在 AWS Lambda 上采样 [时间限制错误]。为什么?

问题描述

我正在使用scipylib 在 AWS Lambda 函数中运行一些 Python (3.8) 代码。首先,我将 wavfile 读入变量:

source = scipy.io.wavfile.read('/tmp/letov.wav')

它似乎工作正常,getsizeof(source)返回56,据我了解,这意味着变量中有一些数据。

然后这一行运行,脚本无限挂起:

audio_samples = source[1].tolist()

为什么?

当我在本地机器上运行它时它工作正常(几秒钟)。

但在 Lambda 中,它达到了 300 秒的时间限制。我还尝试将 Lambda 内存从 128mb 增加到 512mb,以确保它不是计算能力问题,没有运气。两种环境中的音频文件相同。

标签: pythonaws-lambdascipywavaudio-processing

解决方案


根据评论中提供的信息,我们知道这source[1]是一个 16 位整数的 numpy 数组,形状为 (2219729, 2)。保存实际整数数组所需的内存是2219729*2*2 = 8878916,或大约 8.5 mb。正如您所说,读取文件有效,并且您有足够的 RAM 将数据保存在内存中。

当您.tolist()在数组上调用方法时会出现问题。这会将数组数据结构转换为纯 Python 嵌套列表列表。也就是说,当你执行时audio_samples = source[1].tolist()audio_samples将会是一个长度为 2219729 的 Python 列表,并且该列表中的每个元素都是一个长度为 2 的 Python 列表,并且内部列表中的每个元素都是一个Python整数(不是 16 位 NumPy 整数) )。单个 Python 整数需要 28 个字节(即getsizeof(1)返回 28)。因此,仅存储所有这些 Python 整数(不考虑列表数据结构),您将需要2219729 * 2 * 28 = 124304824字节,或大约 124mb。另外,最外层的列表大约需要17.8mb,每个内层的列表需要72个字节,所以组合的Python列表数据结构大约需要178mb。将其与这些列表中包含的所有 Python 整数所需的内存相结合,您将获得大约 302mb 的总内存需求。

我的建议:不要使用该tolist()方法将您的样本转换为纯 Python 数据结构。坚持使用source[1]. 也就是说,使用

audio_samples = source[1]

然后audio_samples在后续计算中使用 NumPy 数组。


推荐阅读