ruby - 提高 Ruby 中文件搜索的速度

标签 ruby performance

给定一个包含大约 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/

相关文章:

未在 ubuntu 14.04 上安装 mysql gem for rails

java - Google Dataflow批处理文件处理性能不佳

performance - 使用 WINdows PowerShell 1.0 或 2.0 评估可执行文件的性能

performance - GWT Grid - 如何测量客户端的渲染时间

Ruby strftime : Day without leading zero, %e 不工作

ruby - 在数据库中存储object_id数组及其坐标的方法是什么?

ruby-on-rails - 您期望如何使用 Rspec 中的 .deliver 调用邮件程序函数?

database - 从另一个表创建一个表而不填充它

java - eclipse 中的 Strings.xml 和 values-es - 支持多种语言

javascript - 将 Ruby 查询转换为 javascript?