我正在AWS Lambda函数中使用scipy
lib运行一些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的总内存需求我的建议是:不要使用中的NumPy数组。即使用
tolist()
方法将示例转换为纯Python数据结构。坚持使用^{然后在后续计算中使用NumPy数组
audio_samples
相关问题 更多 >
编程相关推荐