【问题标题】:Good practices to return large amount of data in node在节点中返回大量数据的良好做法
【发布时间】:2017-04-24 07:25:37
【问题描述】:

我已经使用 Koa (nodeJs) 编写了一个 Web 服务器。我需要从 mongo 数据库返回大量数据。大意味着大约 750.000 个 json 数据的数组。每个 json 元素包含几个字符串。

有什么好的方法来编写这样的服务器以避免它崩溃? 我愿意接受所有提示:)

PS:我的客户端是 Unity(c# 或 js)。

【问题讨论】:

  • 为什么要一次全部退回?首先想到的是gzip。如果它仍然不够小,请使用其他类型的压缩来帮助降低它。但老实说,我会尝试看看为什么客户需要一次所有这些数据。
  • 我进行数据可视化,我想一次性将所有数据可视化。但是我可以按包加载它们。
  • 如果是这种情况,您可能还想在服务器端处理/聚合数据以发送更少的数据。
  • 在大多数情况下,你是对的,但在我的情况下,我需要我的整个数据集

标签: node.js mongodb optimization koa


【解决方案1】:

Node 默认情况下对 HTTP 使用分块传输编码,并且使用流,您可以在一个请求中返回 PB 的数据而不会出现任何问题,至少对服务器没有问题 - 让客户端解析该数据是另一回事。

问题在于将大数据序列化为 JSON,这通常是一个阻塞操作,需要内存中的所有数据。但是有可用的流式 JSON 编码器。

例如,查看 Big-Friendly JSON - 大型 JSON 数据集的异步流式处理函数:

另见其他模块:

另外,您不需要发送一个大的 JSON,您可以将其拆分为多个对象。而且您不需要使用 JSON 来序列化数据。您可以使用 CSV、TSV 或任何其他适合您数据的方式。您没有告诉我们有关您的数据的任何信息,因此很难给您具体的建议。

【讨论】:

  • 感谢您的推荐。我正在使用 mongodb,因此将数据存储在 json 中。没有具体原因,只是对我来说管理起来更简单(这是一个不好的原因)。我要去检查你的模块,再次感谢。
【解决方案2】:

由于数据如此庞大,您真的希望一次将所有数据都放在客户端上吗?如果不是,另一个简单的选择是对多个请求的数据进行分页。

mongo 查询可以通过 find 请求的 limit 和 skip 选项轻松丢弃。

您可以使用查询参数http://example.com/large_data?skip=5000&limit=1000. 传递它

【讨论】:

  • 好建议!这正是我正在寻找的语法!非常感谢!
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多