我在PowerShell中使用Robocopy来排序并输出早于用户指定年龄的数百万个文件名。我的问题是:使用Robocopy的日志记录功能更好,然后通过Get-Content -ReadCount
导入日志,或者将Robocopy的输出存储在变量中是否更好,这样脚本就不必写入磁盘?
我必须以正则表达式来获取实际的文件名。我正在使用Robocopy,因为许多文件的路径长度超过248个字符。
一种方式比另一种更优选吗?不要错过任何应该被认为是显而易见的事情。
答案 0 :(得分:2)
您可以通过使用 Measure-Command 衡量每种方法所需的时间,跳过所有关于多种因素的理论和推测,例如:
Measure-Command {$rc_output = robocopy <arguments>}
Measure-Command {robocopy <arguments> /log:rc.log; Get-Content rc.log [...]}
您将获得输出,告诉您每个版本的确切时间,直到毫秒。尝试使用少量样本数据,查看哪一个更快,然后将其应用于数百万个文件。
答案 1 :(得分:1)
我将添加@mjolinor的评论和其他评论。直接回答这个问题:
将信息保存到变量(因此保存到RAM)总是比直接到磁盘更快。 但仅在以下情况下:
变量旨在用于存储小(<10Mb)数据量。它们不是为了保存整个数据库之类的东西。如果数据的大小很大(即数百万行数据,即几十兆字节),那么磁盘总是更好。问题是,如果你把大量的信息输入一个变量,你就会填满你的RAM,一旦你的RAM满了,事情变慢,分页内存开始发生,基本上一切都停止工作,包括任何命令你当前正在运行(即Robocopy)。
总的来说,因为你正在处理数百万行,我的建议是将它写入磁盘,因为你的结果可能会占用相当多的空间,远远超过变量“应该”保持的范围。
现在,在说了所有这些并深入研究程序如何操作内存中的位之后,这一切都无关紧要,因为将内容写入磁盘所花费的时间与它的时间相比非常小。需要处理所有文件。
如果您正在处理1,000,000个文件,并且您以很快的速度处理它们,比如每秒1000个文件,那么处理需要1,000秒。这意味着它需要超过16分钟来运行所有文件。
如果让我们说写入磁盘是坏的,并且使你能够每秒处理5个文件较慢,那么995个文件代替它,它只会运行5秒钟。 5秒是0.5%的影响,与运行整个过程所花费的时间相比,这是无关紧要的。
写入变量更有可能比写入磁盘更麻烦。
答案 2 :(得分:0)
这取决于您正在谈论的输出量,以及您可用的系统资源。如果磁盘I / O时间小于内存管理进入内存所需的额外开销,则将它们写入文件然后再读取它们会更快。你可以尝试它的方式和时间,但我会先尝试将其读入内存,然后使用任务管理器进行监控。如果它开始抛出大量的页面错误,那么你可能最好将磁盘用作中间存储。