NodeJS JSON Axios请求 - 内存效率

时间:2017-10-27 01:44:06

标签: node.js performance memory axios

我正在尝试找到一种更节省内存的方法来在nodejs中发出多个JSON请求。我的应用程序进行了大约500-1000次调用,每次调用返回大约1mb的JSON数据。

目前我正在使用Axios发出请求,我将~1000个请求推送到数组中以传递给Axios。

例如。

 let axiosPromises = [];
 let baseURL = "http://someurl.example.com/?";
 let requests = ['page1', 'page2', 'page3', ... 'page1000'];

 for (let j = 0; j < requests.length; j++) {        

   let axiosPromise = axios.get(baseURL + requests[j], {
            timeout: 300000
   });

   axiosPromises.push(axiosPromise);
 }



 axios.all(axiosPromises).then((response) => {
   // Code to place JSON responses into an array of objects
 }

由于所有这些请求合并后返回大约900mb的JSON数据,我看到节点的内存爆发到~10000mb。我想知道如何以更可扩展/更节省内存的方式处理这个问题。

我已经阅读过关于在节点中读取/写入大文件等时使用流式传输来提高内存效率的内容。我想知道推荐的方法对于这样的情况会是什么,其中产生了数千个Web请求并且响应存储在对象数组中。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

将响应数据写入磁盘,而不是将其保存在内存中

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const axios = require('axios');
const TMP_DIR = fs.mkdtempSync(__dirname + '/');

const makeRequest = async function(page) {
  const baseUrl = 'http://someurl.example.com/?'
  const resp = await axios.get(baseUrl + page);
  const file = path.join(TMP_DIR, page)

  return promisify(fs.writeFile)(file, resp.data);
}


const main = async function() {
  const pages = ['page1', 'page2', 'page3'];
  for (let i = 0; i < pages.length; i++) {
    await makeRequest(pages[i])
 }
}

main()