将大型 JSON 文件读入 C#.net 中的变量

Posted

技术标签:

【中文标题】将大型 JSON 文件读入 C#.net 中的变量【英文标题】:Reading Large JSON file into variable in C#.net 【发布时间】:2016-07-25 21:20:16 【问题描述】:

我正在尝试解析 JSON 文件并将其插入 SQL DB。只要文件很小(小于 5 MB),我的解析器就可以正常工作。

我在尝试读取大 (> 5MB) 文件时收到“内存不足异常”。

if (System.IO.Directory.Exists(jsonFilePath))
                
                    string[] files = System.IO.Directory.GetFiles(jsonFilePath);
                    foreach (string s in files)
                    
                        var jsonString = File.ReadAllText(s);
                        fileName = System.IO.Path.GetFileName(s);
                        ParseJSON(jsonString, fileName);

                    
                

我尝试了 JSONReader 方法,但无法将整个 JSON 转换为字符串或变量。请指教。

【问题讨论】:

什么是“大”? 5.1 毫克? 5555555555 兆字节? 我尝试了 JSONReader 方法,但没有成功将整个 JSON 转换为字符串或变量。 如果“JSONReader”是指来自 Json.NET 的 JsonTextReader,可以你分享你尝试但没有奏效的方法? foreach(文件中的字符串 s) fileName = System.IO.Path.GetFileName(s);使用 (WebClient 客户端 = new WebClient())使用 (StreamReader sr = new StreamReader(client.OpenRead(jsonFilePath + fileName))) 使用 (JsonReader reader = new JsonTextReader(sr)) var jsonString= reader.Value.ToString ();ParseJSON(jsonString, 文件名) 你能分享一个你的 JSON 是什么样子的示例,以及你是如何解析它的吗?即,minimal reproducible example 的问题示例让您了解您在 ParseJSON 中所做的事情,这将使我们更有可能提供有用的答案。 【参考方案1】:

使用 64 位,查看 RredCat 对类似问题的回答:

Newtonsoft.Json - Out of memory exception while deserializing big object

NewtonSoft Jason Performance Tips

阅读 David Cox 关于标记化的文章:

"基本方法是使用 JsonTextReader 对象,它是 Json.NET 库的一部分。JsonTextReader 一次读取一个 JSON 文件。因此,它避免了读取整个文件的开销将文件转换为字符串。当从文件中读取标记时,会创建对象并将其推入和推出堆栈。到达文件末尾时,堆栈的顶部包含一个对象——一棵非常大的树的顶部与原始 JSON 文件中的对象相对应的对象数"

Parsing Big Records with Json.NET

【讨论】:

【参考方案2】:

json 文件太大,无法以任何形式放入内存。

您必须使用接受文件名或流作为输入的 JSON 阅读器。从您的问题中不清楚您使用的是哪个 JSON Reader。来自哪个图书馆?

如果您的 JSON 阅读器构建了整个 JSON 树,您仍然会耗尽内存。当您阅读 JSON 文件时,要么选择您要查找的数据,要么将数据结构写入另一种易于查询的磁盘格式,例如 sqlite 数据库。

【讨论】:

我必须读取整个文件并通过形成数据集存储到 SQL DB 中。 然后使用接受文件名或流作为输入的 JSON 阅读器。 JsonTextReader reader = new JsonTextReader(new StreamReader(jsonFilePath+fileName)); while (reader.Read()) ParseJSON(reader.Value.ToString(), fileName); --- 没有从阅读器获取值作为字符串

以上是关于将大型 JSON 文件读入 C#.net 中的变量的主要内容,如果未能解决你的问题,请参考以下文章

基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

如何将文件内容读入批处理文件中的变量?

将 HDF5 文件中的大型数据集读入 x_train 并在 keras 模型中使用

解析大型 JSON 文件 [重复]