Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何加速代码比较文件大小/名称?_Ruby_File - Fatal编程技术网

Ruby 如何加速代码比较文件大小/名称?

Ruby 如何加速代码比较文件大小/名称?,ruby,file,Ruby,File,我有两个主文件服务器和一个大的备份服务器,但有人在一段时间内错误组织了备份服务器,我需要检查以确保备份服务器上没有不在主服务器上的文件 因此,我想我应该用Ruby编写一些快速代码来实现这一点,它只使用每个驱动器上所有文件的列表(使用File.glob找到),并检查主驱动器上是否存在File.size和File.basename文件 问题是这需要一段时间!!与备份驱动器相比,主驱动器之间的每个文件都需要约0.8秒的时间,如果一个驱动器包含数十万个文件,这是行不通的 有什么建议吗?我认为我的方法效率

我有两个主文件服务器和一个大的备份服务器,但有人在一段时间内错误组织了备份服务器,我需要检查以确保备份服务器上没有不在主服务器上的文件

因此,我想我应该用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)转储出来,并在数据级别进行比较?