python - Scipy wavfile 在 AWS Lambda 上采样 [时间限制错误]。为什么?
问题描述
我正在使用scipy
lib 在 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,以确保它不是计算能力问题,没有运气。两种环境中的音频文件相同。
解决方案
根据评论中提供的信息,我们知道这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 数组。
推荐阅读
- algorithm - Visual Studio Code 如何实现其自动完成功能
- r - 将混合类型折叠成一个整洁的逗号分隔字符串
- amazon-s3 - 尝试访问重新加载或刷新或在角度 5 的新选项卡中访问时收到 AccessDenied
- javascript - 简单的正则表达式使 android 崩溃,在 iOS 中运行良好
- jquery - 如何在不使用 class 或 id 的情况下选择 2nd h2?jQuery
- powershell - AzureSQL 多次调用-SQLCmd 循环和连接错误
- textures - MonoGame 添加纹理
- javascript - React.createRef() 导致错误“预期 ref 是函数或字符串”
- windows - 使用手动分配的控制台在 CMD.EXE 中输出混乱
- c# - 将多个会话添加到一个中(以获得许可)