我在Python中使用音频数据进行一些计算。这曾经很好地工作,直到更大的文件。为了获取数据,我使用wave
模块读取了.wav文件,然后使用struct
将其解压缩并将其作为panads Series
返回。我的代码如下所示:
import wave, struct
import pandas as pd
def loadwav(fname, norm = True):
infile = wave.open(fname)
n = infile.getnframes()
raw = infile.readframes(n)
infile.close()
if norm == True:
return normalize( pd.Series( struct.unpack("{n}h".format(n=n), raw) ) )
else:
return pd.Series(struct.unpack("{n}h".format(n=n), raw))
如上所述,这适用于长度约为20秒的音频文件。不幸的是,我现在必须看一下3或4分钟的整首歌曲,采样频率为44100赫兹。使用上面的代码,python需要700多MB才能将文件加载到工作内存中。这是我的第一个问题: 有没有办法改善我的代码,以便使用更少的内存?是否可以选择在C ++中使用这个函数?内存映射是没有选择的,因为它们很慢。
此外,我发现此代码存在另一个问题。使用IPython笔记本,我加载了一个.wav文件。之后,我删除了包含del
数据的变量。但是用过的内存没有被解除分配。我不得不首先停止ipython内核,以恢复我的记忆。我知道del
只会在删除对内存对象的最后一个引用时清理内存。但就我而言,只有一个。所以,我的第二个问题:为什么python的行为如此,如何从内存中删除数据?
我在OS X 10.6上使用Python 2.7,IPython 0.13 谢谢