我正在尝试使用'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的方法,其中数据存储在数据库中..
答案 0 :(得分:1)
你可以:
答案 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