【发布时间】:2019-08-07 14:36:03
【问题描述】:
我有一个 API 方法可以将大约 100k 行从数据库加载到内存中,并且这些行中的每一行都包含一个 JSON 字符串。对于每个请求,JSON 对象结构在所有行中都是相同的(相同的对象键),尽管我不会提前知道这一点。
目前我正在为每一行调用JObject.Parse(row.Json) 以获取一个JObject。当我检查堆时,我可以看到每个对象键字符串的重复条目。因此,如果我在每一行的 JSON 中有对象键 id 并且我有 100k 行,我会在内存中看到该字符串的 100k 个实例。
我想缓存(或可能String.Intern(),取决于生命周期)这些对象键并重用这些JObjects 中的字符串。我可以看到使用 JsonConvert.DeserializeObject() 我可以提供一个自定义转换器,但是 AFAIK 他们让你修改 JSON 值而不是键。
注意:我必须一次在内存中保存所有 100k 行,因为我稍后会运行一个需要一次所有内容的算法。
【问题讨论】:
-
听起来你需要一个不同的内存结构;从您的“对象”列表转换为一组数组...您可以解析第一行的键数组,然后可以将所有行解析为 JSON 数组,
[key1,key2,key3][ [r1c1val],[r1c2val],[r1c3val], [r2c1val] ... -
相关:Newtonsoft json.net JsonTextReader Garbage Collector intensive。
AutomaticJsonNameTable来自 this answer 可能是你想要的。
标签: c# json string json.net deserialization