Ruby 如何加速代码比较文件大小/名称?
我有两个主文件服务器和一个大的备份服务器,但有人在一段时间内错误组织了备份服务器,我需要检查以确保备份服务器上没有不在主服务器上的文件 因此,我想我应该用Ruby编写一些快速代码来实现这一点,它只使用每个驱动器上所有文件的列表(使用File.glob找到),并检查主驱动器上是否存在File.size和File.basename文件 问题是这需要一段时间!!与备份驱动器相比,主驱动器之间的每个文件都需要约0.8秒的时间,如果一个驱动器包含数十万个文件,这是行不通的Ruby 如何加速代码比较文件大小/名称?,ruby,file,Ruby,File,我有两个主文件服务器和一个大的备份服务器,但有人在一段时间内错误组织了备份服务器,我需要检查以确保备份服务器上没有不在主服务器上的文件 因此,我想我应该用Ruby编写一些快速代码来实现这一点,它只使用每个驱动器上所有文件的列表(使用File.glob找到),并检查主驱动器上是否存在File.size和File.basename文件 问题是这需要一段时间!!与备份驱动器相比,主驱动器之间的每个文件都需要约0.8秒的时间,如果一个驱动器包含数十万个文件,这是行不通的 有什么建议吗?我认为我的方法效率
有什么建议吗?我认为我的方法效率很低。忘记ruby,只需阅读
rsync
命令的手册即可。您可以使用dry run
或其他混合选项只比较两个主目录,而不复制文件。从执行速度和花在这项工作上的时间来看,它会快得多。Dir.glob
返回一个数组,因此您最终需要扫描搜索的每个文件的完整文件列表。如果您有100000个文件,这意味着您将执行100000^2个操作。通过合并具有固定时间访问的集合
,您可能会大大加快速度,从而将工作负载减少到100000个操作。您可以尝试以下方法:
require 'set'
files_to_search = Set.new(Dir.glob('/that/path/**/*'))
files_to_search.include?('foo')
但是,您也可能会遇到其他限制,例如内存,或者Ruby相对来说没有那么快,因此如果Set
不起作用,您可能需要尝试使用shell工具。MichałMłoźniak的rsync
解决方案可能会起到作用,或者您可能会想出一些其他方法来修补shell命令并获取所需信息。例如,您可以签出diff
,或者与find
结合使用以澄清问题-问题是备份系统上的目录结构没有组织。文件不会与主服务器中的文件位于同一文件夹中。所以我需要检查文件名/大小,而不是使用目录。你能粘贴一些代码吗?当你能真正看到它时,告诉你如何改进它会更容易。数百秒听起来似乎不起作用。耐心点!你有多少张?为什么不能将目录结构和格式良好的数据(如JSON、CSV、YAML)转储出来,并在数据级别进行比较?