裁剪音频文件时Python3中的MemoryError

时间:2019-04-15 12:32:36

标签: python audio memory

我正在尝试使用pydub模块来修剪一些有声读物的章节中的前/外音频。所有文件的范围为9-19MB。 它设法执行一些文件,然后返回MemoryError。我有8BG的RAM,所以我认为做这件事一定很糟糕。

我已经在关闭所有其他程序的情况下运行了它,没有任何区别。我尝试在任务管理器中观察内存使用情况。通常为350MB左右,偶尔会达到900-1000MB,尤其是在每个文件末尾。

from pydub import AudioSegment
import os, eyed3

os.chdir(r'C:\Users\User\Music\audiobooks podcasts\Narnia\Edit Testing')

NarniaList = os.listdir()

for i in NarniaList[:10]:
    print('Ammending ' + i + '...')
    track = AudioSegment.from_mp3(i)
    newcut = track[75000:-59000]
    newtitle = 'New'+i
    newcut.export(newtitle,format="mp3")
    audiofile = eyed3.load(i)
    newfile = eyed3.load(newtitle)
    newfile.tag.artist = audiofile.tag.artist 
    newfile.tag.album = audiofile.tag.album
    newfile.tag.title = audiofile.tag.title
    newfile.tag.save()

它每次至少管理2个文件,我得到的最好是5个。 据我所知,完成后我不会保留以前的文件,但是我是一个新手,所以我不确定。任何建议,不胜感激。

1 个答案:

答案 0 :(得分:1)

代码泄漏内存的一个地方是:

newcut.export(newtitle,format="mp3")

export返回文件句柄。现在,文档说将AudioSegment对象写入文件–返回输出文件的文件句柄(尽管您不必对其执行任何操作)。,这是AFAIK不正确的,如所解释的在this bug report中。文件句柄必须关闭。

目前,在我看来,来自export的所有字节都在泄漏。由于您要加载mp3,因此很多-并且会出现内存错误。

如果这样做不能解决问题,请执行以下操作:

import tracemalloc
from pydub import AudioSegment
import os, eyed3

tracemalloc.start()

os.chdir(r'C:\Users\User\Music\audiobooks podcasts\Narnia\Edit Testing')

NarniaList = os.listdir()

for i in NarniaList[:2]:
    print('Ammending ' + i + '...')
    track = AudioSegment.from_mp3(i)
    newcut = track[75000:-59000]
    newtitle = 'New'+i
    newcut.export(newtitle,format="mp3")
    audiofile = eyed3.load(i)
    newfile = eyed3.load(newtitle)
    newfile.tag.artist = audiofile.tag.artist 
    newfile.tag.album = audiofile.tag.album
    newfile.tag.title = audiofile.tag.title
    newfile.tag.save()

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)

在处理两个音频文件之后,这将使您成为十大内存使用者。