如何在PowerShell中导入1.19GB大JSON文件?
大JSON文件的PowerShell导入方案
针对1.19GB级别的大JSON文件,常规Get-Content结合ConvertFrom-Json会触发System.OutOfMemoryException,甚至直接读取拼接内容的方式也会因为内存不足失败,这里提供PowerShell 7.3.6下的可行解决办法:
流式反序列化核心方案
利用.NET的System.Text.Json.JsonSerializer进行流式读取,避免一次性加载整个文件到内存:
# 引入所需.NET命名空间 using namespace System.Text.Json using namespace System.IO # 打开目标JSON文件的只读流 $fileStream = [File]::OpenRead("你的大文件路径.json") try { # 配置JSON解析选项(按需调整,比如忽略大小写、允许尾随逗号等) $jsonOptions = [JsonSerializerOptions]@{ PropertyNameCaseInsensitive = $true AllowTrailingCommas = $true } # 异步流式反序列化并同步获取结果 $jsonObj = [JsonSerializer]::DeserializeAsync($fileStream, [object], $jsonOptions).GetAwaiter().GetResult() } finally { # 确保流被正确释放,避免资源泄漏 $fileStream.Dispose() }
数组类大JSON的逐元素处理(内存更友好)
如果你的大JSON是数组结构,可以用JsonDocument逐元素解析,进一步降低内存占用:
using namespace System.Text.Json using namespace System.IO $fileStream = [File]::OpenRead("你的数组格式大文件.json") try { $docOptions = [JsonDocumentOptions]@{ AllowTrailingCommas = $true CommentHandling = [JsonCommentHandling]::Skip } # 解析JSON文档 $jsonDoc = [JsonDocument]::Parse($fileStream, $docOptions) $rootElement = $jsonDoc.RootElement # 遍历数组元素并处理 if ($rootElement.ValueKind -eq [JsonValueKind]::Array) { foreach ($element in $rootElement.EnumerateArray()) { # 将单个元素转为PowerShell对象 $item = [JsonSerializer]::Deserialize($element, [PSObject]) # 这里替换为你的业务处理逻辑 Write-Output "已加载元素:$($item.Name)" } } } finally { $jsonDoc.Dispose() $fileStream.Dispose() }
以上两种方法都是基于.NET的流式JSON处理能力,不会把整个文件内容加载到内存,从根源上避免内存溢出问题。
内容的提问来源于stack exchange,提问作者dharmatech
相关产品推荐
相关产品推荐

