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

时间:2017-01-16 21:37:06

标签: ruby file

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

所以我想我会在Ruby中编写一些快速代码来执行此操作,它只使用每个驱动器上的所有文件列表(使用File.glob找到)并检查主驱动器上是否存在文件使用File.size和File.basename。

问题是需要一段时间!!主驱动器与备份驱动器之间的每个文件每个需要大约0.8秒,并且如果驱动器有数十万个文件,那么这不会起作用。

有什么建议吗?我假设我的方式非常低效。

2 个答案:

答案 0 :(得分:2)

忘记ruby,只需阅读rsync命令的手册。您可以使用dry-run或其他混合选项来比较两个主目录而无需复制文件。在执行和花在工作上的时间方面会更快。

答案 1 :(得分:0)

Dir.glob会返回Array,因此您最终需要扫描您要搜索的每个文件的完整文件列表。如果您有100,000个文件,那意味着您将进行100,000 ^ 2次操作。您可以通过合并具有恒定时间访问权限的Set来加快速度,从而将工作负载减少到100,000次。你可以尝试这样的事情:

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配对。