专业人士如何处理成千上万,甚至数百万个JSON对象? node.js

时间:2019-11-06 05:47:29

标签: node.js json performance data-structures bigdata

专业人员如何处理成千上万,甚至数百万个JSON对象?

我最近完成了一个小应用程序,该应用程序请求十几个JSON对象(它们是我生成的电影对象)。因为我使用的对象很少,所以当我想解析和搜索JSON中的特定对象时,就无需以高效的方式进行编码。

但是,如果我正在开发一个真正的专业应用程序,并且收到了10万个JSON对象,我该怎么处理:

  1. 存储所有对象,以便后端可以使用它
  2. 高效搜索特定对象

例如,假设这10万个对象是电影,其中每个对象都有一个类型和演员列表。我真的可以将这100K解析为一个数组,然后循环遍历以找到感兴趣的对象吗?

如果后端有100万个电影JSON对象而不是10万个怎么办?似乎拥有一百万个条目数组或遍历整个百万个对象通常看起来效率很低,并且可能减慢前端速度。

对于我的小型应用程序,我只是将所有22个JSON对象保存到一个名为“ allMovies”的全局数组中,我可以进行简单的线性搜索来找到所需的内容,但是如果我有一百万个电影对象,我也看不到我的应用程序(处于当前状态)将可扩展。

我对此仍然很陌生,但这本质上是我的问题,即如何有效地存储大量JSON对象(后端已接收到)并有效地搜索它们。我正在寻找有关可以实施的学科或数据结构的指南。

我制作的小应用程序是在node.js中。

2 个答案:

答案 0 :(得分:3)

专业人员使用数据库。

首先要意识到的是您不使用JSON对象。您正在处理数据。 JSON恰好是您接收数据的协议,但它可能是XML或CSV或ASN.1或Bencoding或Protobuf-数据的格式无关紧要,只有内容才重要。

现在,要使用哪种数据库类型取决于数据,接收数据的速率以及对数据的处理方式。有时您会被迫使用多种类型的数据库。

SQL /关系数据库在数据结构化或具有复杂关系时表现出色。正确设计的SQL数据库会将数据的不同部分分为不同的表,然后定义表之间的关系-例如,您将有一个actors表来存储所有参与者,然后是一个movies表来存储所有参与者电影,然后再用另一个cast表将演员链接到电影。这样可以避免重复数据,特别是当您拥有庞大的数据集时。

诸如LDAP之类的分层数据库提供了非常快速的查找,尤其是在大规模并行集群上实施时。这是因为查找路由可以利用数据层次结构。因此,电话系统已在分层数据库上实现了标准化。

诸如MongoDB和ElasticSearch(Lucene)之类的文档数据库擅长快速数据插入和相对快速的查询。在最简单的情况下,数据库只会将您的JSON数据直接直接保存到新文件中(是​​的,大多数文档数据库都基于JSON)。但是,通常不会进行重复数据删除,因此,如果您有电影数据库,则演员姓名将在出现的所有电影中重复。另一方面,如果您有演员数据库,则电影标题将为重复的。这也说明了一个事实,您需要仔细设计文档数据库的结构,并选择正确的根对象来表示所有数据。

还有其他数据库类型,但是它们往往更加深奥,并且在非常特定的用例(例如缓存,日志记录等)中使用。

答案 1 :(得分:1)

有趣的问题。没有正确或单一的答案。我们每个人都将根据特定解决方案的效果提供答案。

让我尝试提供解决方案,以及您可以采取的一系列步骤以最终确定解决方案。

  • 您描述中的数据是一组电影对象, 被频繁搜索。大量读取。
  • 这将被输入一次并更新几次。
  • 在前端涉及大量文本搜索和排序
  • 您正在为您的应用程序使用NodeJS和客户端-服务器类型的体系结构,因此这将涉及REST API

因此,以上是我可以指出的一些特征,这些特征将用于解决方案。 由于我们可以看到您拥有的数据应该是高度可搜索的并且是实时的,因此它主要由动态变化的JSON对象数据组成。我们可以使用elasticsearch或MongoDB或任何其他支持NoSQL DB的文本搜索。

现在我们有了一个数据库,可以继续设计数据流。

  

这里的重要一步是数据库设计以及如何有效进行   创建参考,唯一能做到这一点的人就是你   对域有更好的了解。

     

步骤1 -电影对象首先必须解析并插入数据库和/或弹性搜索索引中。我想这是通过将对象存储在all movies数组中(可以充当客户端缓冲区)以较小的规模完成的。当缓冲区已满时,您可以使用应用程序中的XHR或AJAX调用REST API,将allMovies数组卸载到后端。

  // Incoming movies
  var newMovie = {your data from forms, other source, etc}
  allMovies.push(newMovie);
  if(allMovies.length >= 20 )
  {
   //make API call to backend.
   //empty the buffer
    allMovies = [];
  } 
  //else wait for new movie

第2步:在后端,只需将数据存储到数据库中,对搜索次数最多的字段进行索引。这是我提到的2个数据库的参考。

  

请注意,elasticsearch索引还在MongoDB处插入数据   具有两步插入和索引操作。

第3步:这可能是您显示的部分,并允许用户搜索电影数据库。在这里,您将必须创建一个新的API,该API可以为您的用户以及应用程序前端执行自定义搜索。可以有多个API或一个API端点,可以接受多个参数(例如搜索和排序)。

最终步骤是将所有这些功能集成在一起,以无缝方式将结果交付给您的应用。我将通过一个简单的图尝试说明该流程。

enter image description here