MemoryError в Python3 при обрезке аудиофайлов - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь использовать модуль Pydub для обрезки вступительного / выходного аудио из глав некоторых аудиокниг.Все файлы находятся в диапазоне 9-19 МБ.Ему удается сделать несколько файлов, а затем вернуть MemoryError.У меня 8 ГБ ОЗУ, поэтому я полагаю, что должен был что-то делать довольно плохо, чтобы это стало причиной.

Я запустил его с закрытыми другими программами, без разницы.Я пытался наблюдать за использованием моей памяти в диспетчере задач.Обычно около 350 МБ, иногда до 900-1000 МБ, особенно в конце каждого файла.

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 Ответ

1 голос
/ 16 апреля 2019

Одно место, где у вашего кода течет память:

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

export возвращает дескриптор файла. Теперь документация гласит: Записать объект AudioSegment в файл - возвращает дескриптор файла выходного файла (однако вам не нужно ничего с ним делать). , что неверно в AFAIK, как описано в это сообщение об ошибке . Дескрипторы файла должны быть закрыты.

В настоящее время мне кажется, что все байты, поступающие с 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)

Это даст вам 10 лучших потребителей памяти после обработки двух аудиофайлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...