如何在进行波计算时节省内存

时间:2013-05-12 12:29:56

标签: python memory audio memory-management ipython

我在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 谢谢

0 个答案:

没有答案