在node.js中处理大型json数组

3

我使用axios从API获取数据并在我的node.js应用程序中使用数据。

这些数据是一个包含300个对象的数组,其中每个对象都像这样:

{
  'location': 'us',
  'date': '156565665',
  'month': '5.1',
  'day': '6',
  'type': 'default',
  'count': '7',
  'title': 'good',
  'filter': 'no',
  'duration': 'short',
  'options': 'no',
}

在获取到这个对象数组后,我需要对每个对象进行转换:将其键替换为新的键,并将某些值转换为正确的数据类型(字符串转浮点数):

{
  'loc': 'us',
  'date_new': parseInt('156565665'),
  'month': parseFloat('5.1'),
  'day': parseInt('6'),
  'type': 'default',
  'count': parseInt('7'),
  'title': 'good',
  'filter': 'no',
  'duration': 'short',
  'options': 'no',
}

目前我只是使用for循环,每次迭代将每个对象的键和值进行转换。但会有成千上万个这样的对象。这将是一个处理这些数据的工作。在node.js中处理它们的最佳方法是什么?

我打算使用一些现成的队列,比如bee-queue或者resque,但即使在这种情况下,也最好让代码“按照node.js的方式”来处理我的对象数组,这样不会减慢node循环。也许可以将每个对象推送到Promise数组中,并将它们放到Promise.all()中(但Promise.all()中将有300个Promise)?在node.js中进行这样的复杂计算的最佳方法是什么?


你能控制页面大小从300到小于10吗? - gurvinder372
你可以使用 https://github.com/dominictarr/JSONStream 和 https://dev59.com/B2ct5IYBdhLWcg3wuPu6。 - gurvinder372
@gurvinder372 我会尝试并给出反馈。 - Stas Coder
让我们在聊天室中继续这个讨论 - Stas Coder
300个对象转换就是轻量级的东西。保持简单并使其正常工作,然后进行测试,不要在不知道问题所在之前进行优化,然后您可以直接解决问题。承诺不会帮助您按照您描述的方式使用它们,并且也不需要。 - lecstor
显示剩余3条评论
1个回答

3

但是会有成千上万个类似这些的对象。需要一个处理这些数据的工具。在 node.js 中,最好的处理方式是什么?

我建议:

示例

var request = require('request')
  , JSONStream = require('JSONStream')
  , es = require('event-stream')

request({url: 'URL'})
  .pipe(JSONStream.parse('rows.*'))
  .pipe(es.mapSync(function (data) {
    console.error(data)
    return data
  }))
  • 解析后,将它们存储在数据库中,而不是立即处理,因为对于一个大对象的硬计算将会阻塞Nodejs的处理。

  • 从数据库中逐个选择它们进行处理。


我该如何逐个从数据库中选取每个对象?我使用的是Firebase。我只能够从数据库中选取整个对象数组。 - Stas Coder
我认为你也可以将单个JSON作为文档保存。请参考https://firebase.google.com/docs/database/web/structure-data。 - gurvinder372
那么也许我不需要将 JSON 保存在数据库中?也许我可以一次性处理它? - Stas Coder
@StasCoder,你在问题中提到你的处理过程中会进行一些复杂的计算,因此我建议推迟这些计算,直到你可以逐个选择这些记录。 - gurvinder372

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接