2013-06-20 5 views
0

Я пытаюсь читать mp3-файлы с помощью «mp3info» gem и просматривая каждый файл, который заканчивается на .mp3 в его имени файла в каталоге и перемещается в каталог с помощью Dir.chdir() и повторить процесс и сохранить эти теги в базе данных. Но у меня есть 30-граммовая музыкальная коллекция, и для завершения сканирования требуется около 6-10 минут. Есть ли способ оптимизировать это сканирование?Оптимизация чтения id3-тегов mp3-файлов

 def self.gen_list(dir) 
     prev_pwd=Dir.pwd 
     begin 
      Dir.chdir(dir) 
     rescue Errno::EACCES 
     end 
     counter = 0 
     Dir[Dir.pwd+'/*'].each{|x| 
      #puts Dir.pwd 
      if File.directory?(x) then 
       self.gen_list(x) do |y| 
        yield y 
       end 
      else if File.basename(x).match('.mp3') then 
        begin 
         Mp3Info.open(x) do |y| 
          yield [x,y.tag.title,y.tag.album,y.tag.artist] 
         end 
        rescue Mp3InfoError 
        end 
       end 
      end 
     } 
     Dir.chdir(prev_pwd) 
    end 

Это метод, который генерирует список и отправляет теги на & блок, где данные хранятся в базе данных ..

+0

Не могли бы вы показать код? – Dogbert

+0

Я думал, что код будет не очень полезен, обновил вопрос с помощью некоторого кода .. спасибо – pahnin

ответ

1

Вы пытались установить флаг parse_mp3 на false? по умолчанию это означает, что вы собираетесь вытащить весь файл для каждого сканирования, когда все, о чем вы заботитесь, это информация. Я не знаю, сколько времени это спасет вас. Дополнительную информацию см. В источнике github.

https://github.com/moumar/ruby-mp3info/blob/master/lib/mp3info.rb#L214

# Specify :parse_mp3 => false to disable processing of the mp3 
def initialize(filename_or_io, options = {}) 
+0

он сохранен как 4 минуты, ответы othes также действительны, спасибо:) – pahnin

1

Вы можете:

  1. Выполнить несколько процессов (для каждого каталога базовый каталог, например)
  2. Используйте темы с rubinius или JRuby.
+0

Я попробую использовать потоки .. – pahnin

1

Вы можете попробовать taglib-ruby драгоценный камень, который отличается от обложки mp3info над библиотекой C, и это может дать вам немного больше производительности. В противном случае вы должны придерживаться JRuby и запускать несколько потоков (4, если у вас 4 ядра).

+0

Я попробую taglib спасибо – pahnin

0

Вы также можете воспользоваться более прямым способом извлечения файлов mp3.

Dir['**/*.mp3'].each |filepath| 
    Mp3Info.open(filepath) do |mp3| 
    ... 
    end 
rescue Mp3ErrorInfo 
    ... 
end 

Это найдет все файлы .mp3 на любой глубине из текущего каталога и даст относительный путь к блоку. Это приблизительно эквивалентно find . -name '*.mp3' -print

Смежные вопросы