Node js'readline'-接近堆限制分配的无效标记压缩失败

时间:2019-07-01 19:29:30

标签: javascript node.js express httprequest v8

她就是我在代码中所做的

基本上是进行网页抓取

我正在阅读一个包含3500个链接的文本文件,然后阅读每个链接,过滤所需的链接,并请求获取状态代码,链接和页面标题(使用cheerio)。带有异步迭代器结构,用于逐行读取以及使用axios和async等待。一切正常,直到第900个链接,我都收到此讨厌的致命错误 “致命错误:接近堆限制的无效标记紧凑-分配失败-JavaScript堆内存不足” enter image description here

我不知道这是怎么回事,这是网络服务器将我踢出去(看起来不像)还是我的代码编写不正确并且v8引擎没有处理它?(更有可能)

这是我的代码,如果有人想尝试使用大量链接运行,我用https://hackertarget.com/extract-links/来获取链接,然后将其放在文本文件中。

var request = require('request');
var cheerio = require('cheerio');
var URL = require('url-parse');
var axios = require('axios');
const fs = require('fs');
const readline = require('readline');
const timeout = require('./timeout')

var main = [];
async function processLineByLine() {
  const rl = readline.createInterface({
    input: fs.createReadStream('C:/Users/T440/Documents/crawl/links.txt'),
    crlfDelay: Infinity
  });

  for await (const line of rl) {
    if (line.startsWith('https://www.example.com')) {
      var encodeLink = encodeURI(line);
    
      const response =  await axios.get(encodeLink).catch((err)=>{
        var Status_ErrorsCatchaxios = {
            "status Code": err.response.status ?error.response.status:"No status code available",
            "Page title:": $('title').text()?$('title').text():'No title avaialble',
            "Original Link": encodeLink?encodeLink:"No Original Link Available",
            "errorCode":err
          }
          main.push(Status_ErrorsCatchaxios)
      })
      try {
        const body = response.data;
        if (response.status === 200) {
          // Parse the document body
          var $ = cheerio.load(body);
          var Status_200 = {
            "status Code": response.status,
            "Page title:": $('title').text(),
            "Original Link": encodeLink,
          }
          main.push(Status_200)
        }
  
        if (response.status === 302 || response.status === 404 || response.status === 500) {
          // Parse the document body
          var Status_Errors = {
            "status Code": response.status,
            "Page title:": $('title').text(),
            "Original Link": encodeLink,
          }
          main.push(Status_Errors)
        }
            fs.writeFile("C:/Users/T440/Documents/crawl/output.json", JSON.stringify(main), (err) => {
            if (err) console.log(err);
            console.log("Successfully Written to File.");
          });
      } catch (error) {

          var Status_ErrorsCatch = {
          "status Code": response.status ?error.response.status:"No status code available",
          "Page title:": $('title').text()?$('title').text():'No title avaialble',
          "Original Link": encodeLink?encodeLink:"No Original Link Available",
        }
        main.push(Status_ErrorsCatch)
      }      
        
    }
  }
}
processLineByLine()

1 个答案:

答案 0 :(得分:0)

我认为我遇到了同样的问题。最初发现此问题的引用:cheerio+v8 "leaks" memory。我认为这是Cheerio / V8中的内存泄漏。我还没有找到解决问题的方法,但是我尝试了以下方法:

  1. 创建一个Unleak函数,如下所示:Unleak
  2. 运行具有更多内存的节点'node --max-old-space-size = 8192 app.js'
  3. 在暴露垃圾回收器的情况下运行节点,并将其称为“ node -expose-gc app.js”,然后调用Global.gc()

1和2的影响最大。我敢肯定这只是我的代码,因为这是旧问题了。