【问题标题】:Deserialising large data taking too long反序列化大数据耗时过长
【发布时间】:2017-07-01 02:21:54
【问题描述】:
[HttpGet]
public IEnumerable<Facility> AllFacilities()
{
    string jsondata  = Data.GetFacilities;
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerialize();
    javaScriptSerializer.MaxJsonLength = int32.MaxValue;
    return javaScriptSerializer.Deserialize<List<Facility>>(jsondata);
}

当有大量数据时,反序列化花费的时间太长。有没有办法提高它的性能。喜欢返回一部分数据并在加载其余部分时向用户显示。我的应用程序只是在浏览器页面中显示 xml 格式的输出

我尝试了收益回报。我对此了解不多。我所期待的是“jsondata”中的每个设施记录都被反序列化并被一一返回,以便用户可以在其他人正在加载的同时看到一些东西。但这并没有发生。

[HttpGet]
public IEnumerable<Facility> AllFacilities()
{
    string jsondata  = Data.GetFacilities;
    JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
    javaScriptSerializer.MaxJsonLength = int.MaxValue;
    foreach (var x in javaScriptSerializer.Deserialize<List<Facility>(jsondata))
    {
        yield return x;
    }
}

这两个 sn-ps 以相同的方式返回数据。我究竟做错了什么?或者有更好的方法吗?请给我建议。

【问题讨论】:

  • 尝试使用JSON.NET,似乎比内置的序列化器效率更高。
  • foreach (var x in javaScriptSerializer.Deserialize&lt;List&lt;Facility&gt;&gt;(json)) 仍在一次对整个 JSON 对象执行反序列化,然后迭代每个结果记录,这就是为什么没有帮助
  • 感谢您的回复。我已经尝试过 JSON.NET,但它仅在几秒钟内对性能没有太大帮助。这种反序列化需要几分钟来加载数据。如何在反序列化之前对 jsondata 进行分块?最好的方法是什么?任何想法表示赞赏。
  • 查看this stackoverflow answer 看看是否可行。我从未使用过它,所以我只发布评论而不是答案,但看起来你可以在解析每个条目时触发回调。总处理时间可能没有什么不同,但您将能够获取数据并开始使用它,因为它通过 json 字符串运行
  • 感谢您的建议。我会试试看,然后告诉你。

标签: c#


【解决方案1】:

尝试使用分页(来自 JSON.NET 的 JArray 类) -

[HttpGet]
public IEnumerable<Facility> Facilities(int pageNumber, int pageSize)
{
    string jsondata = Data.GetFacilities;
    JArray a = JArray.Parse(jsondata);
    return a.Skip(pageNumber * pageSize).Take(pageSize).Select(x => x.ToObject<Facility>());
}

【讨论】:

  • 但是.. 这是 OP 已经拥有的确切代码。这如何“更直接”?
  • 这是我正在寻找改进建议的代码,因为大型 jsondata 的反序列化耗时太长。
  • 我的建议是edit你的答案,以便它真正回答问题或删除它。在当前状态下,它没有回答任何问题
  • 我的显示 xml 格式数据的页面实际上并不需要寻呼机(您可以在其中单击并从一页移动到下一页)。它只显示 xml 格式的数据。有没有办法在没有寻呼机的情况下做到这一点?
  • 你是什么意思“喜欢返回部分数据并在加载其余部分时向用户显示。”?
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 2014-11-07
相关资源
最近更新 更多