优化mp3文件的读取id3标签

时间:2013-06-20 04:36:18

标签: ruby file optimization mp3

我正在尝试使用'mp3info'gem读取mp3文件,并浏览每个文件,该文件以文件名中的.mp3结尾,并使用Dir.chdir()进入目录并重复该过程将这些标签存储在数据库中但我有30GB的音乐收藏,整个扫描完成需要大约6-10分钟。有什么办法可以优化这次扫描吗?

        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

这是生成列表并将标签发送到& block的方法,其中数据存储在数据库中..

4 个答案:

答案 0 :(得分:1)

你可以:

  1. 运行多个进程(例如,对于基础目录中的每个目录)
  2. 使用带有rubinius或JRuby的线程。

答案 1 :(得分:1)

你可以试试taglib-ruby gem,它不同于mp3库上的mp3info包装器,它可以为你提供更多的性能。否则你必须坚持JRuby并运行多个线程(如果你有4个核心,则运行4个)。

答案 2 :(得分: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 = {})

答案 3 :(得分:0)

您也可以从更直接的方式检索mp3文件中受益。

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

这将找到当前目录中任何深度的所有.mp3文件,并生成块的相对路径。它大致相当于find . -name '*.mp3' -print