Node JS forEach内存泄漏问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node JS forEach内存泄漏问题相关的知识,希望对你有一定的参考价值。

我一直在创建一个小节点js应用程序,它遍历一系列名称并查询名称的API。我遇到的问题是数组非常大(400,000+个单词),并且我的应用程序在forEach完成之前耗尽了内存。

我已经能够通过研究JS如何使用调用堆栈,web api和回调队列来诊断问题。我认为问题是forEach循环阻塞了调用堆栈,因此http请求继续阻塞回调队列而不解决。

如果任何人都可以提供解锁forEach循环的解决方案或另一种编码此应用程序的方法,我会非常感激。

Node JS App

const mongoose = require("mongoose");
const fs = require("fs");
const ajax = require("./modules/ajax.js");

// Bring in Models
let Dictionary = require("./models/dictionary.js");


//=============================
//     MongoDB connection
//=============================

// Opens connection to database "test"
mongoose.connect("mongodb://localhost/bookCompanion");
let db = mongoose.connection;

// If database test encounters an error, output error to console.
db.on("error", (err)=>{
  console.error("Database connection failed.");
});

db.on("open", ()=>{
  console.info("Connected to MongoDB database...");
}).then(()=>{

  fs.readFile("./words-2.json", "utf8", (err, data)=>{

    if(err){
      console.log(err);
    } else {
      data = JSON.parse(data);

      data.forEach((word)=>{
      let search = ajax.get(`API url Here?=${word}`);
      search.then((response)=>{
        let newWord = new Dictionary ({
          word: response.word,
          phonetic: response.phonetic,
          meaning: response.meaning
        }).save();
        console.log("word saved");
      }).catch((err)=>{
        console.log("Word not found");
      });
      });

    };
  });

});
答案

校验

  1. 检查api是否接受多个查询参数。
  2. 尝试使用异步Promises。
  3. 解决承诺并尝试通过PromisesPromise#all执行保存操作

以上是关于Node JS forEach内存泄漏问题的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 内存泄漏?

Websocket 内存泄漏 node.js。事件发射器?

node.js 中的长循环泄漏内存

Node.js 刮板中的内存泄漏

Node.js内存泄漏分析

Node.js内存泄漏分析