0

我正在尝试使用 '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

4 回答 4

1

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

于 2013-06-20T06:36:08.050 回答
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 = {})
于 2013-06-20T15:23:51.740 回答
1

你可以:

  1. 运行多个进程(例如,对于基本目录中的每个目录)
  2. 使用带有 rubinius 或 JRuby 的线程。
于 2013-06-20T06:02:01.887 回答
0

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

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

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

于 2013-06-21T15:57:46.303 回答