Scipy wav 文件到 AWS Lambda 上的示例 [时间限制错误]。为什么?
Scipy wavfile to samples [time limit err] on AWS Lambda. Why?
我正在 运行使用 scipy
库在 AWS Lambda 函数中添加一些 Python (3.8) 代码。
首先,我将 wavfile 读入变量:
source = scipy.io.wavfile.read('/tmp/letov.wav')
它似乎工作正常,getsizeof(source)
returns 56
,据我了解,这意味着变量中有一些数据。
然后这一行 运行s 和脚本无限挂起:
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)
returns 28)。因此,仅存储所有这些 Python 整数(不考虑列表数据结构),您将需要 2219729 * 2 * 28 = 124304824
字节,或大约 124mb。此外,最外层的列表大约需要 17.8mb,每个内部列表需要 72 字节,所以合并后的 Python 列表数据结构大约需要 178mb。将其与这些列表中包含的所有 Python 整数所需的内存相结合,您将获得大约 302mb 的总内存需求。
我的建议:不要使用 tolist()
方法将样本转换为纯 Python 数据结构。坚持使用 source[1]
中的 NumPy 数组。即使用
audio_samples = source[1]
然后在后续计算中使用 NumPy 数组 audio_samples
。
我正在 运行使用 scipy
库在 AWS Lambda 函数中添加一些 Python (3.8) 代码。
首先,我将 wavfile 读入变量:
source = scipy.io.wavfile.read('/tmp/letov.wav')
它似乎工作正常,getsizeof(source)
returns 56
,据我了解,这意味着变量中有一些数据。
然后这一行 运行s 和脚本无限挂起:
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)
returns 28)。因此,仅存储所有这些 Python 整数(不考虑列表数据结构),您将需要 2219729 * 2 * 28 = 124304824
字节,或大约 124mb。此外,最外层的列表大约需要 17.8mb,每个内部列表需要 72 字节,所以合并后的 Python 列表数据结构大约需要 178mb。将其与这些列表中包含的所有 Python 整数所需的内存相结合,您将获得大约 302mb 的总内存需求。
我的建议:不要使用 tolist()
方法将样本转换为纯 Python 数据结构。坚持使用 source[1]
中的 NumPy 数组。即使用
audio_samples = source[1]
然后在后续计算中使用 NumPy 数组 audio_samples
。