JSON Powershell内存问题
我使用一个命令来读取JSON文件,这一切都非常有效,直到文件变大 我目前有一个大约1.5GB的JSON文件。我使用以下命令使用Powershell读取文件:JSON Powershell内存问题,json,powershell,memory,Json,Powershell,Memory,我使用一个命令来读取JSON文件,这一切都非常有效,直到文件变大 我目前有一个大约1.5GB的JSON文件。我使用以下命令使用Powershell读取文件: get-content -Path C:\TEMP\largefile.json | out-string | ConvertFrom-Json 它返回以下错误: out-string : Exception of type 'System.OutOfMemoryException' was thrown. + ... oices = g
get-content -Path C:\TEMP\largefile.json | out-string | ConvertFrom-Json
它返回以下错误:
out-string : Exception of type 'System.OutOfMemoryException' was thrown.
+ ... oices = get-content -Path C:\TEMP\largefile.json | out-string | Conve ...
+ ~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Out-String], OutOfMemoryException
+ FullyQualifiedErrorId : System.OutOfMemoryException,Microsoft.PowerShell.Commands.OutStringCommand
我增加了内存,如下所示:
get-item wsman:localhost\Shell\MaxMemoryPerShellMB
WSManConfig: Microsoft.WSMan.Management\WSMan::localhost\Shell
Type Name SourceOfValue Value
---- ---- ------------- -----
System.String MaxMemoryPerShellMB 8096
关于如何处理这个问题有什么想法吗
根据评论编辑添加内容:
删除out字符串时,会出现以下错误:
ConvertFrom-Json : Exception of type 'System.OutOfMemoryException' was thrown.
+ ... oices = get-content -Path C:\TEMP\largefile.json | ConvertFrom-Json ...
+ ~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Out-String], OutOfMemoryException
+ FullyQualifiedErrorId : System.OutOfMemoryException,Microsoft.PowerShell.Commands.OutStringCommand
我拥有的Powershell版本是:5.1.17763.1490
该文件包含多个关于PDF文件的列。这些文件通过API导出为JSON,因此它包含文件元数据,如所有者和创建时间,以及列正文中的实际PDF文件,稍后将解码为实际PDF文件。结构如下:
[{"Id":"ID","ParentId":"parent","Name":"filename","OwnerId":"owner","CreatedDate":"date","Body":"*******"}
{"Id":"ID","ParentId":"parent","Name":"filename","OwnerId":"owner","CreatedDate":"date","Body":"*******"}
{"Id":"ID","ParentId":"parent","Name":"filename","OwnerId":"owner","CreatedDate":"date","Body":"*******"}
{"Id":"ID","ParentId":"parent","Name":"filename","OwnerId":"owner","CreatedDate":"date","Body":"*******"}
{"Id":"ID","ParentId":"parent","Name":"filename","OwnerId":"owner","CreatedDate":"date","Body":"*******"}
]
谢谢你提供的细节。
对于这个问题,我将尝试分别转换每一行,并将其流式传输到您的流程中:
Get-Content C:\TEMP\largefile.json | ForEach-Object {
$_ = $_.Trim().TrimStart('[').TrimEnd(']')
if ($_) { $_ | ConvertFrom-Json }
}
如前所述,如果这些内存问题不会出现在中,我不会感到惊讶。如果可能的话,我建议您也尝试一下。谢谢您提供的详细信息。
对于这个问题,我将尝试分别转换每一行,并将其流式传输到您的流程中:
Get-Content C:\TEMP\largefile.json | ForEach-Object {
$_ = $_.Trim().TrimStart('[').TrimEnd(']')
if ($_) { $_ | ConvertFrom-Json }
}
如前所述,如果这些内存问题不会出现在中,我不会感到惊讶。如果可能的话,我建议您也尝试一下。您是否尝试过删除| Out字符串?Get Content已经返回字符串,ConvertFrom Json能够自己将它们粘在一起。它返回相同的错误。显而易见的想法是不使用PowerShell,或者使用简化的逻辑和一些文本预处理,不依赖于一次性转换整件事,而只转换文档的一部分。将JSON转换为动态对象的开销在内存和时间上都是相当大的,而增加内存限制只能做到这一点。您可以通过利用JSON.NET之类的库并使用JsonTextReader以增量方式处理JSON,但在PowerShell中这有点笨拙。它返回相同的错误。您好@iRon,谢谢您的反馈,我已经在主帖子中添加了这些内容。如果需要更多信息来帮助我,请告诉我。您是否尝试删除| out字符串?Get Content已经返回字符串,ConvertFrom Json能够自己将它们粘在一起。它返回相同的错误。显而易见的想法是不使用PowerShell,或者使用简化的逻辑和一些文本预处理,不依赖于一次性转换整件事,而只转换文档的一部分。将JSON转换为动态对象的开销在内存和时间上都是相当大的,而增加内存限制只能做到这一点。您可以通过利用JSON.NET之类的库并使用JsonTextReader以增量方式处理JSON,但在PowerShell中这有点笨拙。它返回相同的错误。您好@iRon,谢谢您的反馈,我已经在主帖子中添加了这些内容。如果需要更多信息来帮助我,请告诉我。看起来这很有帮助,让我试试看。我会让你知道的,谢谢,这是有进展的,我唯一的问题是我需要将那一行添加到一个变量中,但我似乎无法让它工作。所以foreach对象我需要做一些操作,所以我需要它在一个变量中进行处理,在这个过程之后,foreach对象必须用新行替换这个变量。很高兴听到这个消息。我不确定我是否仍在同一页上,但在您处理内存问题时,从开始到结束都要尊重PowerShell管道,这一点很重要。也就是说,如果您需要特定的行,您可以执行以下操作|其中对象ID-eq“MyID”|。。。。如果另一方面添加,则需要更改几行,但要求它们全部通过,直到最后一个cmdlet,您可以执行以下操作|ForEach对象{if$uu0.Id-eq'MyID'{$0.Name='test'};$0}|..如果这对您没有任何帮助,我建议您使用此答案并打开一个新答案,参考此答案以及您当前所在位置的更多详细信息、实际结果和预期结果。我在这里创建了一个新问题:看起来这很有帮助,让我试试看。我会让你知道的,谢谢,这是有进展的,我唯一的问题是我需要将那一行添加到一个变量中,但我似乎无法让它工作。所以foreach对象我需要做一些操作,所以我需要它在一个变量中进行处理,在这个过程之后,foreach对象必须用新行替换这个变量。很高兴听到这个消息。我不确定我是否仍在同一页上,但在您处理内存问题时,从开始到结束都要尊重PowerShell管道,这一点很重要。也就是说,如果您需要特定的行,您可以执行以下操作|其中对象ID-eq“MyID”|。。。。如果另一方面添加,则需要更改几行,但要求它们全部通过,直到最后一个cmdlet,您可以执行以下操作|前面
ach对象{if$u.Id-eq'MyID'{$u.Name='test'};$}|..如果这对您没有帮助,我建议您使用此答案并打开一个新答案,参考此答案以及您当前所在位置的更多详细信息、实际结果和预期结果。我在这里创建了新问题: