给定一个包含大约 100 000 个小文件的目录(每个文件大约 1kB)。 我需要获取这些文件的列表并对其进行迭代,以便找到具有相同名称但大小写不同的文件(这些文件位于 Linux ext4 FS 上)。 目前,我使用这样的代码:
def similar_files_in_folder(file_path, folder, exclude_folders = false)
files = Dir.glob(file_path, File::FNM_CASEFOLD)
files_set = files.select{|f| f.start_with?(folder)}
return files_set unless exclude_folders
files_set.reject{|entry| File.directory? entry}
end
dir_entries = Dir.entries(@directory) - ['.', '..']
dir_entries.map do |file_name|
similar_files_in_folder(file_name, @directory)
end
这种方法的问题是代码片段占用了大量资源!!!完成的时间。 我的系统大约需要几个小时。
是否有另一种方法可以在 Ruby 中实现相同的目标但速度更快?
限制:我无法在内存中加载文件列表,然后只比较小写的名称,因为在@directory 中出现了新文件。 因此,我需要在每次迭代时扫描@directory。
感谢任何提示。
最佳答案
如果我对你的代码的理解正确,这已经返回了一个包含所有这些 100k 文件名的数组:
dir_entries = Dir.entries(@directory) - ['.', '..']
#=> ["foo.txt", "bar.txt", "BAR.txt", ...]
我会按小写文件名对这个数组进行分组:
dir_entries.group_by(&:downcase)
#=> {"foo.txt"=>["foo.txt"], "bar.txt"=>["bar.txt", "BAR.txt"], ... }
然后选择出现次数超过 1 次的:
dir_entries.group_by(&:downcase).select { |k, v| v.size > 1 }
#=> {"bar.txt"=>["bar.txt", "BAR.txt"], ...}
关于ruby - 提高 Ruby 中文件搜索的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18248733/