taglib-ruby и балансировка ресурсов (освобождение файловых дескрипторов)? - PullRequest
1 голос
/ 22 января 2012

Друзья

Я пытаюсь обработать огромное количество аудиофайлов с помощью сценария Ruby (1.9.3) путем сканирования их ID3-тегов с использованием довольно быстрого taglib-ruby (0,2 .1 через Gem-Server).

Вот часть моего кода, в то время как audio содержит полный путь к файлу в Ruby-String:

begin 
  file_ref = TagLib::FileRef.new(audio) 
  unless file_ref.tag.nil? 
     unless file_ref.tag.artist.nil? or file_ref.tag.title.nil?
       …
     end
  end
ensure
 file_ref = nil
end

Тогда у меня проблемы почти в конце обработки. TagLib жалуется на отсутствие разрешений на чтение и FileUtils.mv больше не может перемещать файл впоследствии. Вероятно, это так, потому что мой скрипт не освобождает файловые дескрипторы, которые TagLib ест во время обработки.

К сожалению, Я не нашел определенного метода Ruby в taglib-ruby API, который в конечном итоге вызывает одну или несколько из TagLibs C-функций:

taglib_tag_free_strings();
taglib_file_free(file);

libmagic Привязки Ruby, например, предоставляют close -Metod в своем классе Magic, так что освобождение внутри гарантирует, что блоки будут работать.

Мне не хватает правильного метода Ruby для taglib-ruby или он отсутствует в данный момент? Есть ли другой способ освобождения файловых дескрипторов, полученных через Ruby?

1 Ответ

0 голосов
/ 25 февраля 2012

Я предполагаю, что вы на самом деле используете taglib-ruby , а не старый ruby-taglib . Если вы используете taglib-ruby, FileRef (и другие классы :: File) имеют явный метод close начиная с версии 0.3.0, см. Документация API .

Обновление: Начиная с версии 0.4.0, еще лучшим решением является использование метода класса open, который принимает блок и автоматически обрабатывает закрытие после его запуска. См. документация открытого . Пример:

TagLib::FileRef.open(file_name) do |file|
  tag = file.tag
  # do things with tag
end
...