我正在尝试找到一种更节省内存的方法来在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请求并且响应存储在对象数组中。
非常感谢您的帮助!
答案 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()