Memory Powershell内存使用情况

Memory Powershell内存使用情况,memory,powershell,Memory,Powershell,我有点像一个傻瓜,所以请不要惩罚我:-) 所以我需要处理一些相当大的日志文件(600mb),我的脚本基本上去掉了包含“Message Received”的行,然后标记这些行,并将一些标记输出到输出文件 脚本的逻辑很好(虽然我确信它可能更有效),但问题是,当我向输出文件写入行时,文件只会随之变大,powershell使用的内存量也会增加到内存耗尽的程度 有人能建议我怎样才能阻止这种事情发生吗?我想把日志分解成一个只有10mb的临时文件,然后改为在临时文件上处理 这是我的代码,你们能给我的任何帮助都

我有点像一个傻瓜,所以请不要惩罚我:-) 所以我需要处理一些相当大的日志文件(600mb),我的脚本基本上去掉了包含“Message Received”的行,然后标记这些行,并将一些标记输出到输出文件

脚本的逻辑很好(虽然我确信它可能更有效),但问题是,当我向输出文件写入行时,文件只会随之变大,powershell使用的内存量也会增加到内存耗尽的程度

有人能建议我怎样才能阻止这种事情发生吗?我想把日志分解成一个只有10mb的临时文件,然后改为在临时文件上处理

这是我的代码,你们能给我的任何帮助都会很棒:-)


您有效地将整个日志文件存储在内存中,而不是逐位顺序访问它

假设您的日志文件中的每个条目(可能是新行)都有一些内部分隔符,您一次读取每个条目,而不会在内存中保留超出绝对需要的内容

您将无法依赖内置的PowerShell东西,因为它处于“影响愚蠢”状态

您必须向我的代码示例道歉,我的PowerShell有点生锈了

var $reader = Create-Object "System.IO.StreamReader" testoutput.txt
var $s = ""
while(($s = reader.ReadLine())!=null)
{ 
    // do something with '$s' 
    // which would contain individual log entries.
}
$reader.Close()

如果您在管道中执行所有操作,那么每次只需要在内存中存储一个对象(本例中为文件中的一行)

Get-Content $inputFile | Where-Object { $_ -match "Message Received" } |
  foreach-object -process {
  $fields = [regex]::split($_,'\s+') # An array is created
  Add-Content -path $outputFile -value [String]::Join(" ", $fields[0,1,2,3,15,17])
}
$fields[0,1,2,3,15,17]
创建一个给定的
$fields索引数组


这也可以在单个管道中使用表达式而不是传递给Select对象的属性名来完成,但不太清楚。

一个有效的powershell示例:

$csvFile = "c:\test.txt"

$file_reader = [System.IO.File]::OpenText($csvFile)
$row = "";
while(($row = $file_reader.ReadLine()) -ne $null) 
{ 
    # do something with '$row' 
    Write-Host row: $row
}
$file_reader.Close()

谢谢你,理查德,正如你所看到的,我是个傻瓜,但我会做到的:-)
$csvFile = "c:\test.txt"

$file_reader = [System.IO.File]::OpenText($csvFile)
$row = "";
while(($row = $file_reader.ReadLine()) -ne $null) 
{ 
    # do something with '$row' 
    Write-Host row: $row
}
$file_reader.Close()