使用节点在内存中处理大型JSON数据集

问题描述:

我正在从Salesforce中提取JSON数据。我可以有大约10 000个记录,但从来没有更多。为了防止Api限制并且必须为每个请求打Salesforce,我想我可以每小时查询一次数据,然后将其存储在内存中。显然这会更快,并且更不容易出错。使用节点在内存中处理大型JSON数据集

一个JSON对象将有大约10个属性,也许还有一个嵌套的JSON对象有两个或三个属性。

我正在使用类似于以下的方法来查询记录。

getUniqueProperty: function (data, property) { 
    return _.chain(data) 
     .sortBy(function(item) { return item[property]; }) 
     .pluck(property) 
     .uniq() 
     .value(); 
} 

我的问题是

  • 会的后果是由数据存储到内存中,并在内存中的数据的工作是什么?我显然不想通过对数据进行大量过滤来阻止服务器。

  • 我从来没有使用过redis,但会像缓存db的帮助?

  • 最好是每隔一小时查询数据,并将JSON响应存储为Mongo等。然后,我会尽我所有反对Mongo而不是内存?每查询一次Salesforce,我只需刷新数据库并重新插入数据。

+0

假设您的salesforce数据在该小时内正在更新,则所有请求都会过期,直到下一次更新。 – Andy

+0

一点也不担心数据过期。它可能已经过时了。它可能只会被更新,无论如何都需要每隔几个小时才能完成。 – TYRONEMICHAEL

在存储器中存储你的数据有几个缺点:

  • 不可扩展 - 当你决定使用多个进程,每个进程将需要相同的API请求;
  • 脆弱 - 如果您的进程崩溃,您将丢失数据。

此外,处理大量数据可能会阻止比您想要的更长的时间。

解决方案: - 使用外部存储!它可以是redis,也可以是MongoDB或RDBMS; - 更新独立进程中的数据,使用cron触发; - 不要删除整个数据库:在此之后有人可能会提出请求(如果您的存储不支持事务),请更新记录。

+0

我简要地看了一下redis。因为它是一个关键的价值商店,所以对数据进行富查询不是不可能的吗?举例来说,我将无法查询JSON数据,比如说,vehicleMake是丰田?我想过更新记录,但事情变得非常复杂。我只需要与应用程序相关的数据,因为所有数据都存储在Salesforce上。如果我丢失了数据,我只需查询Salesforce即可重新获取相关数据并处理相关数据。我能否为复杂的查询生成子进程? – TYRONEMICHAEL

+0

@TyroneMichael如果您需要复杂的查询MongoDB或RDBMS是一个不错的选择。如果您为每个查询生成一个子项,那么您必须处理每次通过IPC传递数据或从salesforce请求数据的开销。如果你有一个恶魔查询过程,它将基本上重新创建数据库管理系统。 – vkurchatkin