【问题标题】:Nodejs Split large array and make multiple API callsNodejs拆分大数组并进行多个API调用
【发布时间】:2021-07-13 23:36:42
【问题描述】:

我有一个 CSV 文件,其中包含 21k 条记录(1 字字母数字类型/行)。我需要读取这些记录并将它们发送到 JSON 键值对格式的 API,以进行一次只接受 500 个元素的处理。我有一个解决方案,但我想知道有没有更好或更有效的解决方案/算法?

算法:

  1. 将 CSV 加载到数组中
  2. 将此一维数组拆分为固定长度为 500 列(元素)的 N 数组
  3. 使用这 N 个 500 元素数组中的每一个,准备 JSON 有效负载并发送到 API。

代码:

var dataArray = [];

fs.readFile(inputPath, 'utf8', function (err, data) {
    dataArray = data.split(/\r?\n/);  
 })


var temp = [];
for(i=0;i<dataArray.length;){
  temp=[];
 for(j=0;(j<500 && i<dataArray.length);j++){  
    temp.push(data[i]);
    i++;
  }
  // make API call with current values of temp array
  makeCallToAPI(temp);
}

【问题讨论】:

  • 'Better' 是相对的,如果效率是目标,那么我建议您查看流式传输文件,而不是将整个文件加载到内存中。此外,鉴于您想分块处理文件,无论如何似乎更自然。

标签: javascript node.js arrays algorithm performance


【解决方案1】:

我会使用 lodash 或下划线 _.chunk()。另请注意,fs 和 API 都可以更好地处理异步。

const _ = require('lodash');

async function callApi(chunk) {
  // return a promise that resolves with the result of the api
}

async function readFS(inputPath) {
  return new Promise((resolve, reject) => {
    fs.readFile(inputPath, 'utf8', function (err, data) {
      if (err) reject(err);
      else resolve(data.split(/\r?\n/));
    });
  });
}

async function doTheWork(inputPath) {
  const data = await readFS(inputPath);
  const chunks = _.chunk(data, 500)
  const promises = chunks.map(callApi)
  return _.flatten(Promise.all(promises));
}

还要注意_.flatten() 的使用,因为最后一个 Promise.all() 将解析为一组由承诺块组成的数组。

【讨论】:

  • 除非我误解了这一点,否则它看起来像是将文件拆分为 500 行的块,然后为每一行调用 API?我认为要求是将该块作为单个调用发布到 API(代码示例以及演示)。个人意见,但我不确定你是否需要 lodash,这似乎是不必要的依赖(除非你已经拥有它)。
  • @James,您的解释正确,在第二次阅读时,也许我误解了 OP。这些库很小,经过良好测试,并且充满了有用的东西。我认为 chunk 本身就值得导入。我已经修正了我的答案(简化了它)假设 api 是一个数据数组的帖子
  • 但是我不会为像这样的单个简单函数引入库依赖项。 (而且我是一个流行的实用程序库的作者。)请注意,更简单的 chunk 可能如下所示:const chunk = (n) =&gt; (xs) =&gt; xs .length &lt;= n ? [xs] : [xs .slice (0, n), ...chunk (n) (xs .slice (n))] 和非递归版本不会更难。
猜你喜欢
  • 2017-09-14
  • 2018-12-17
  • 2022-12-19
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
相关资源
最近更新 更多