将大型 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文件