【问题标题】:Out of Memory Exception during serialization [duplicate]序列化期间内存不足异常[重复]
【发布时间】:2016-08-17 10:02:23
【问题描述】:

我正在从数据库中获取一个对象中的 300k+ 条记录。我正在尝试序列化下面的重物:

List<user> allUsersList = businessProvider.GetAllUsers();
string json = JsonConvert.SerializeObject(allUsersList);

序列化列表时出现以下异常 - allUsersList。

内存不足异常

我正在使用 newtonsoft.json 程序集对其进行反序列化。

【问题讨论】:

  • 我将反序列化以在 UI 中显示它。我应该尝试其他数据结构,例如列表或字典吗?
  • 为什么选择@GiladGreen?这无关紧要。问题是序列化为字符串时的对象太大。他需要使用流或达到他的阈值等
  • 如果 User 类有 User 类型的属性,那么就会有循环,使 Newtonsoft 抛出异常,另外如果列表太大,超过 10,000 个用户也可能抛出此类异常, 能否请您显示用户类的代码
  • 如果不关心性能,您可以拆分列表,一个一个序列化,然后使用硬盘驱动器等持久存储进行组合。
  • 300k 不仅对于 JSON 来说太多了——对于任何用户来说也太多了。

标签: c# json serialization


【解决方案1】:

根据您的评论

我将反序列化以在 UI 中显示它

如果你喜欢你的用户,你不会让他们在 UI 中看到 300k 的字符串记录。相反,您应该添加搜索、排序和分页功能,以便您的用户只会收到少量相关结果。这将提高可用性并作为副作用解决您的服务器端内存问题。

即使您找到了将长字符串序列化到内存中的修复程序,现在也请尝试考虑数据库和 Web 服务器上的负载。想象一下,如果您的网站突然变得流行并且许多用户开始通过请求访问它。如果单个请求使用这么多内存,您的网站将很快崩溃。

【讨论】:

  • 我正在使用 sitefinity CMS,我正在使用使用这些数据的自定义会员提供程序。正如你所说的分页,排序,搜索将由sitefinity处理。我所要做的就是将记录从 api 传递到 sitefinityuserlist。
  • 这不能回答问题
  • 好的,所以只需限制您带回的记录数。 @Liam,是的:这将提高可用性并作为副作用解决您的服务器端问题
  • 如果我有必要在一次调用中通过此操作的所有 300K+,我们该怎么办?
  • 我会与创建此要求的人交谈,并尝试说服她/他有更好的方法。当且仅当它类似于来自机器(而不是用户)的 API 调用 - 我会找到一种方法来序列化它并压缩它以缩短响应。正如其他人所建议的那样,有流。我也将 JSON 视为一种格式,可能有更好的二进制序列化格式,例如 FlatBuffers。在我看来,您正在尝试解决错误的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2010-10-05
相关资源
最近更新 更多