【问题标题】:Process and send large amount of data using Hapijs使用 Hapijs 处理和发送大量数据
【发布时间】:2016-10-20 01:24:45
【问题描述】:

我们正在使用 Hapijs/React/Sequelize/MySQL。有件事让我很困惑,我对此进行了一些研究。

设置:

我们有向 Hapi API 发出 AJAX 调用的 React 组件。 API 返回一个对象数组。这是由 React 显示的。 问题: 我们从表中请求数据。该数据作为复杂对象数组返回。这些对象中的每一个都是一个 sequlize 对象。它还有许多我们不需要的附加属性。 我们使用 HAPI 回复发送该对象,例如(40k 个对象):

flattenedParts.forEach(function(item) {
          item.dataValues.Product = productsMap[item.dataValues.ProductId] || [];
          item.dataValues.PartModule = partModulesMap[item.dataValues.PartModuleId] || [];
          fullObjects.push(item);
      });

      reply(fullObjects).code(200);

当代码到达回复语句时,需要 14 秒才能将其作为 JSON 对象的简单数组发送。

对我来说,这些对象的序列化似乎需要很长时间。所以我想制作一个普通对象数组,只包含我需要的数据。我做了这样的事情(40k 个对象)::

flattenedParts.forEach(function(item) {
          item.Product = productsMap[item.dataValues.ProductId] || [];
          item.PartModule = partModulesMap[item.dataValues.PartModuleId] || [];
          var flat = new partCreator(item);
          newParts.push(flat);
      });

      reply(fullObjects).code(200);

零件创建功能很简单:

function partCreator(part){
  this.Product = {};
  this.id = part.dataValues.id;
  this.PartNumber = part.dataValues.PartNumber;
  ... 
  }

所以最后我得到了包含我需要的数据的简单对象的数组。速度现在约为 7 秒。速度提高了近 50%。 但如果我是正确的,它应该会快得多。 回复功能在幕后发生了什么,如何加快速度?

【问题讨论】:

  • 尝试在fullObjects 上计时JSON.stringify()。也许您只是想对一个巨大的数据结构进行字符串化。您真的需要将所有内容发送给客户吗?
  • 按照目前的设计,我们有一个显示所有结果的数据网格。该数据网格有许多过滤器,根据设计,这些过滤器只会给出完整数据集的结果。可能是我们需要重新考虑当前的设计......只是还什么都不知道:(

标签: javascript node.js hapijs


【解决方案1】:

当您想要返回 40K(!) 个对象时,无需做很多事情来利用性能。您很快就会遇到扩展问题,在大规模情况下,您无法处理和处理服务器内存中的这么多对象。 REST API 的目的是接收请求并快速返回少量数据。您必须限制加载到内存中的数据量,并且不应超过 100(即使 100 也很多)。您必须扩展您的 API 以支持您想要的所有功能(分页、排序、搜索等),并扩展客户端以向您的 API 发出更多请求。顺便说一句,在速度不太快的设备上运行的一些浏览器也会出现性能问题。

【讨论】:

  • 你只是证实了我的想法。我不会全部获取它们,而是会进行某种递归以分块获取它们。也许 20k 块(需要 3 秒才能得到它)。
  • @Wexoni 你要在用户的屏幕上显示所有 20k 行吗?
  • 我需要同时在屏幕上呈现500k。我们有一个运行速度很快并且能够做到这一点的 DataGrid。
  • 这只是从服务器获取数据的问题。但是现在当我实现块获取它会快得多
  • @Wexoni 至少在后端使用迭代器时要小心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多