【发布时间】:2017-07-03 04:17:42
【问题描述】:
这里有什么非常低效的吗?这个过程似乎比它应该花费的时间更长。我正在解析许多 JSON 文件,每个文件都有一个 JsonArray 对象。也许有更多经验的人可以指出这种将 JSON 解析为对象的方法中的错误,从而为我节省了大量时间。
此外,内存使用量缓慢上升 MB 有时会导致内存不足异常..
public void Parse(){
using (BabysFirstsUsersDataEntities db = new BabysFirstsUsersDataEntities()
{
foreach (var path in Directory.EnumerateFiles(@"C:\\examplepath\").OrderBy(f => f))
{
string jsonString = System.IO.File.ReadAllText(path);
JToken tok = JObject.Parse(jsonString);
Debug.WriteLine("path: " + path);
foreach (var x in tok.First.First)
{
JsonUserImageDTO jdto = x.ToObject<JsonUserImageDTO>();
UserImageList uil = jdto.ToDataModel();
if (uil.REID != null)
db.UserImageLists.Add(uil);
}
}
db.SaveChanges();
}
}
每个 .json 文件中的 JSON 字符串之一的示例如下所示。请注意,这些文件大约有 1000 个,每个文件都可以有数千个这样的条目:
{
"results": [
{
"ACL": {
"asdf": {
"read": true,
"write": true
},
"role:admin": { "read": true }
},
"REID": "exampleID",
"createdAt": "datetime-string",
"email": "example",
"objectId": "example",
"updatedAt": "datetimestring",
"urlCount": 1,
"urlList": [ "exampleurl" ]
},
{
"ACL": {
"asdf": {
"read": true,
"write": true
},
"role:admin": { "read": true }
},
"REID": "exampleID",
"createdAt": "datetime-string",
"email": "example",
"objectId": "example",
"updatedAt": "datetimestring",
"urlCount": 1,
"urlList": [ "exampleurl" ]
}
]
}
【问题讨论】:
-
我会检查 #1 并报告... #2 是指文件的名称,它是我实现处理与不同模型对应的不同文件类型的剩余部分。我现在将对其进行更改,因为它使事情看起来比实际复杂一些
-
喜欢这个? StreamReader sr = new StreamReader(path); JsonReader 阅读器 = 新 JsonTextReader(sr); var tok = JObject.Load(reader);
-
你真的分析过你的代码吗?请参阅 Erik Lippert 的 performance rant:在开始研究替代方案之前,请使用分析器或其他分析工具凭经验确定瓶颈所在。。
-
有多少文件,你真的需要orderby吗?该 orderby 将导致系统在开始循环之前枚举文件夹中的所有文件。