Powershell 将输出存储在变量中还是将输出存储到文件中更有效?

Powershell 将输出存储在变量中还是将输出存储到文件中更有效?,powershell,robocopy,Powershell,Robocopy,我在PowerShell中使用Robocopy对超过用户指定年龄的数百万个文件名进行排序和输出。我的问题是:使用Robocopy的日志功能,然后通过Get Content-ReadCount导入日志更好吗?还是将Robocopy的输出存储在一个变量中更好,这样脚本就不必写入磁盘 我必须用正则表达式来获得实际的文件名。我使用Robocopy是因为许多文件的路径长度超过248个字符 一种方式比另一种更受欢迎吗?不要错过一些应该被认为是显而易见的东西。这取决于您谈论的输出量以及可用的系统资源。如果磁盘

我在PowerShell中使用Robocopy对超过用户指定年龄的数百万个文件名进行排序和输出。我的问题是:使用Robocopy的日志功能,然后通过Get Content-ReadCount导入日志更好吗?还是将Robocopy的输出存储在一个变量中更好,这样脚本就不必写入磁盘

我必须用正则表达式来获得实际的文件名。我使用Robocopy是因为许多文件的路径长度超过248个字符


一种方式比另一种更受欢迎吗?不要错过一些应该被认为是显而易见的东西。

这取决于您谈论的输出量以及可用的系统资源。如果磁盘I/O时间小于内存管理进入内存所需的额外开销,则将它们写入文件,然后将其读回会更快。您可以尝试两种方法并计时,但我会尝试先将其读入内存,同时使用任务管理器监视它。如果它开始抛出大量页面错误,这表明您最好将磁盘用作中间存储。

这取决于您谈论的输出量以及可用的系统资源。如果磁盘I/O时间小于内存管理进入内存所需的额外开销,则将它们写入文件,然后将其读回会更快。您可以尝试两种方法并计时,但我会尝试先将其读入内存,同时使用任务管理器监视它。如果它开始抛出大量页面错误,这表明您最好使用磁盘作为中间存储器。

您可以通过使用Measure命令测量每种方法所需的时间来跳过有关多个因素的所有理论和推测,例如:

度量命令{$rc_output=robocopy}

度量命令{robocopy/log:rc.log;获取内容rc.log[…]}


您将得到输出,告诉您每个版本所用的时间,精确到毫秒。在少量样本数据上试用,看看哪一种更快,然后将其应用到数百万个文件中。

通过使用“测量”命令测量每种方法所需的时间,您可以跳过有关多个因素的所有理论和推测,例如:

度量命令{$rc_output=robocopy}

度量命令{robocopy/log:rc.log;获取内容rc.log[…]}


您将得到输出,告诉您每个版本所用的时间,精确到毫秒。在少量样本数据上试用,看看哪一个更快,然后将其应用于数百万个文件。

我将添加到@mjolinor的注释和其他注释中。要直接回答问题:

将信息保存到变量并因此保存到RAM总是比直接保存到磁盘更快。但仅在以下情况下:


变量设计用于存储小的I将添加到@mjolinor的注释和其他注释中。要直接回答问题:

将信息保存到变量并因此保存到RAM总是比直接保存到磁盘更快。但仅在以下情况下:


变量被设计用来存储小数据。对某些东西进行基准测试的唯一方法是用您自己的数据实际执行这两种方法,并比较结果。任何实际上不这样做的都只是猜测。让我问一下……在存储输出之后,在该过程的生命周期中,它需要被再次读取多少次?为什么要使用Robocopy来实现这一目的?为什么不使用PowerShell?@Trevor:问题是我使用Robocopy是因为很多文件的路径都超过248个字符。啊,错过了这一行。对某些东西进行基准测试的唯一方法是使用您自己的数据实际执行这两种方法,并比较结果。任何实际上不这样做的都只是猜测。让我问一下……在存储输出之后,在该过程的生命周期中,它需要被再次读取多少次?为什么要使用Robocopy来实现这一目的?为什么不使用PowerShell?@Trevor:问题是我使用Robocopy是因为很多文件的路径都超过248个字符。啊,漏掉了那一行。用一个小样本来尝试总是可以更快地将结果保存到变量中。内存耗尽导致的性能问题不会出现,除非您开始将其扩展到足够的数据,以便内存管理参与进来。使用小样本进行尝试总是可以更快地将结果保存到变量中。内存耗尽导致的性能问题在您开始将其扩展到足够的数据以进行内存管理之前不会出现。您能否提供一个源,说明变量设计用于存储小于10MB的数据?这更多是我个人的限制,因为从技术上讲.NET对象的大小可以达到2GB。这并不是说我反对拥有大的变量,而是说
这对你来说是一个很好的评价,如果这是正确的做事方式。变量用于处理数据,而不是永久存储数据。所以,像日志记录这样的事情,你想在哪里存储数据,实际上不应该在变量中,而是应该存储到磁盘上。当您想要处理数据时,最好是从文件中逐行处理,然后将整个文件加载到内存中,然后再进行处理。您能否提供一个源,说明变量设计用于存储小于10MB的数据?这更多是我个人的限制,因为从技术上讲.NET对象的大小可以达到2GB。这并不是说我反对拥有大的变量,更重要的是,这对你来说是一个很好的观点,来评估这是否是正确的做事方式。变量用于处理数据,而不是永久存储数据。所以,像日志记录这样的事情,你想在哪里存储数据,实际上不应该在变量中,而是应该存储到磁盘上。当您想要处理数据时,最好从文件中逐行处理,然后将整个文件加载到内存中,然后进行处理。