将Scipy wavfile复制到AWS Lambda上的样本[时限错误]。为什么?

2024-05-18 05:44:42 发布

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

我正在AWS Lambda函数中使用scipylib运行一些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,以确保这不是计算能力的问题,没有运气。两种环境中的音频文件相同


1条回答
网友
1楼 · 发布于 2024-05-18 05:44:42

从评论中提供的信息中,我们知道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数据结构。坚持使用^{中的NumPy数组。即使用

audio_samples = source[1]

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

相关问题 更多 >