【问题标题】:How to modify this script to run either in pieces...to not consume all my memory?如何修改此脚本以分段运行...不消耗我所有的内存?
【发布时间】:2014-02-19 09:06:24
【问题描述】:

我遇到了一个小问题,场景是这样的:13.300 个文件夹,每个文件夹中有 20 个不同内容的 .zip 文件。我需要找到其中包含 .txt 文件的文件,然后将其删除,但在 13.300 个文件夹中保留最新的 X。

但首先我想检查一下我总共有多少个包含 .txt 文件的 zip 文件。

脚本如下所示:

# the .zip files are in the 13.300 folders which are in "c:\topfolder"

$motherfolder = "c:\topfolder"
$childfolder = Get-Childitem "c:\topfolder"

$searchTerms = @( ".txt")
function openZip($zipFile){
    try{
        [Reflection.Assembly]::LoadWithPartialName( "System.IO.Compression.FileSystem" ) | Out-Null;
        $zipContens = [System.IO.Compression.ZipFile]::OpenRead($zipFile);  
        $zipContens.Entries | % {
            foreach($searchTerm in $searchTerms){
                if ($_.Name -imatch $searchTerm){
                    Write-Output ($_.Name + "," + $_.FullName + "," + $_.CompressedLength + "," + $_.LastWriteTime + "," + $_.Length);
                }
            }               
        }
    }
    catch{
        Write-Output ("There was an error:" + $_.Exception.Message);
    }
}  

foreach ($childfolder in $motherfolder) {
Get-ChildItem  $zipfolder -recurse *.zip | sort modifyTime -desc | select -skip 2  {
    openZip $_.FullName  >> "C:\Projects\PSScripts\report.csv"
    }
}

当这个脚本在服务器上运行时,它需要很长时间并吃掉所有的内存,那么修改它的最佳方法是什么?首先让脚本只检查前 500 个文件夹而不是 13.300 ?而不是另外500个等等? 第一次遇到这个问题……

【问题讨论】:

  • 您可以使用其他软件(例如 7Zip)来查看 zip 文件吗?普通的 .Net 是必需的吗?
  • 是的,我们可以使用 7zip,这不是问题。我们在那台机器上有 .net 4.5,这就是我采用这种方法的原因。

标签: powershell zip out-of-memory powershell-3.0


【解决方案1】:

问题识别

由于您正在读取文件并与压缩程序进行交互,
你的问题不是记忆,而是:

  • 磁盘速度(文件 IO)
  • CPU / 处理能力(压缩/解压缩)

建议的解决方案

我怀疑如果您使用 SSD,您会看到性能显着提升...在 RAID 1 配置中甚至更多。

替代解决方案

您可以在停机期间运行计划,以缓存您需要读取的所有文件的内容,并在执行检查/搜索时将缓存的信息加载到内存中。
这样一来,IO 一次性完成,其余在 RAM 中完成,速度更快。

【讨论】:

  • 谢谢你,我实际上“修复”了它,只需要最多 1000 个项目并对此执行操作。然后我再次为接下来的 1000 个项目等运行它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2014-02-09
  • 2012-12-28
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多