gpt4 book ai didi

c# - 从磁盘加载大型 json 文件时出现内存不足异常

转载 作者:行者123 更新时间:2023-11-30 13:36:05 30 4
gpt4 key购买 nike

我有一个 1.2 GB 的 json 文件,反序列化后应该会给我一个包含 1500 万个对象的列表。

我尝试对其进行反序列化的计算机是具有 16 核和 32 GB Ram 的 Windows 2012 服务器(64 位)。

该应用程序是使用 x64 目标构建的。

尽管如此,当我尝试读取 json 文档并将其转换为对象列表时,我遇到了内存不足异常。当我查看任务管理器时,我发现只使用了 5GB 内存。

我试过的代码如下..

一个。

 string plays_json = File.ReadAllText("D:\\Hun\\enplays.json");

plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);

b.

 string plays_json = "";
using (var reader = new StreamReader("D:\\Hun\\enplays.json"))
{
plays_json = reader.ReadToEnd();
plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);
}

c.

 using (StreamReader sr = File.OpenText("D:\\Hun\\enplays.json"))
{
StringBuilder sb = new StringBuilder();
sb.Append(sr.ReadToEnd());
plays_json = sb.ToString();
plays = JsonConvert.DeserializeObject<List<playdata>>(plays_json);
}

真诚感谢所有帮助

最佳答案

问题是您正在将整个大文件读入内存,然后尝试将其全部反序列化为一个大列表。您应该使用 StreamReader 来增量处理您的文件。您问题中的示例 (b) 并没有削减它,即使您在那里使用 StreamReader,因为您仍在通过 ReadToEnd() 读取整个文件。你应该做这样的事情:

using (StreamReader sr = new StreamReader("D:\\Hun\\enplays.json"))
using (JsonTextReader reader = new JsonTextReader(sr))
{
var serializer = new JsonSerializer();

while (reader.Read())
{
if (reader.TokenType == JsonToken.StartObject)
{
// Deserialize each object from the stream individually and process it
var playdata = serializer.Deserialize<playdata>(reader);

ProcessPlayData(playdata);
}
}
}

ProcessPlayData 方法应该处理单个播放数据对象,然后理想地将结果写入文件或数据库而不是内存列表(否则您可能会发现自己又回到了同样的情况).如果您必须将处理每个项目的结果存储到内存列表中,那么您可能要考虑使用链表或类似的结构,它不会尝试在一个连续的 block 中分配内存,也不需要重新分配和复制当它需要扩展时。

关于c# - 从磁盘加载大型 json 文件时出现内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39955399/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com