【发布时间】:2017-10-24 22:46:27
【问题描述】:
你好 stackoverflow 用户,
目前我面临以下问题,我有一个打开 .wav 文件的功能,它返回采样率、长度和样本。我已经尝试过使用小文件,它运行良好,现在我正在尝试加载 1GB wav 文件,它返回“MemoryError 未被用户代码处理”窗口。
这是我的功能:
def OpenWavFile(fileName):
waveFile = wave.open(fileName, 'r')
sampFreq = waveFile.getframerate()
length = waveFile.getnframes()
byteList = np.fromstring(waveFile.readframes(length), dtype = np.int16)
return sampFreq, length, byteList
我用断点尝试过,我注意到长度变量的值是 472289280,它适合 int 范围。我在dtype = np.int16这个位置试过这个功能,有不同的类型。
numpy 有限制吗?或者问题出在哪里?
我的笔记本电脑的 RAM 大小为 8Gb。
【问题讨论】:
-
你试过
with open(fileName, 'r') as wavefile: ...这个语法吗? -
你发现异常并检查了吗? docs.python.org/2/library/…
-
您如何在内部存储音频样本?如果它们不以原始二进制格式存储,则会大大增加使用的成员数量。
-
"什么适合 int 范围" 你是什么意思? Python 可变大小是可扩展的。
-
数据至少在内存中重复。它从
readframes返回,byteList需要分配才能再次释放。应该仍然适合内存,但谁知道fromstring.. 中还发生了什么(你可能在运行 32 位 Python 吗?)。如果scipy.io.wavfile.read适合你,你可以试试。如果您不想将文件完全放在内存中,它甚至支持内存映射。