Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSON Powershell内存问题_Json_Powershell_Memory - Fatal编程技术网

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

我使用一个命令来读取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 = 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'};$}|..如果这对您没有帮助,我建议您使用此答案并打开一个新答案,参考此答案以及您当前所在位置的更多详细信息、实际结果和预期结果。我在这里创建了新问题: