【问题标题】:Memory usage of Node.js application increases when writing files写入文件时 Node.js 应用程序的内存使用量增加
【发布时间】:2021-03-29 11:22:54
【问题描述】:

我已连接到 p2p 网络,每隔几秒就会收到一条消息。消息的大小可以是 10 个字符,但也可以是 5 MB。我需要通过将收到的所有消息写入文件系统来记录它们。目前我正在使用 fs.writeFileSync() 但不幸的是,我的应用程序运行的时间越长,内存就会增加:

在这种情况下,我的应用程序运行了 15 个小时并且已经使用了 3.7Gi。我用来写日志的函数如下:

let counter = 0

class Message {
    constructor(data) {
        this.msgId = data.readInt32LE()
        const length = data.readInt32LE()
        // this.data = JSON.parse(data.read(<length>))
    }
    
    // some other methods

    save() {
        if (!fs.existsSync(`/data/${this.msgId}`)) {        
            const data = Object.assign(this.data, {
              index: counter++
            })
            console.log(counter)
            fs.writeFileSync(`/data/${this.msgId}`, JSON.stringify(data))
          }
    }
}

每当我通过 p2p 收到消息时,我都会读取 msgId 以及它包含在构造函数中的数据。在对“消息”对象进行了一些其他业务逻辑之后,我终于调用了 save() 函数。 “内存泄漏”肯定在 save() 函数内部,因为当我将 save() 函数留空时,我的应用程序会运行数天而不会消耗超过 200MB 的内存。那么有谁知道 fs.writeFilesync() 是否存在潜在的内存泄漏或可能导致内存泄漏的原因?

【问题讨论】:

  • 这里有些问题 - 您实际上是否将 data(它是一个对象)传递给 fs.writeFileSync?
  • 是的,对不起...在 save() 函数之前调用了另一个函数(我删除以缩小摘录)。它正在执行一些业务逻辑,最后执行 this.data = JSON.stringify(this.data)。我修复了上面缺少的 JSON.stringify() ......

标签: node.js memory-leaks


【解决方案1】:

我在 Windows 10 上使用节点 15.8.0 时遇到了同样的问题。

我替换了 fs.writeFileSync(files[i], data, { encoding: 'utf8' }); 与

let fd = 0;
try {
   fd = fs.openSync( files[i], 'w', 0o666  );  
   let writen = fs.writeSync( fd, data, 0, 'utf8' );
} catch ( e ) {
} finally {
   if ( fd )
     fs.closeSync(fd);
}

这解决了扩展堆的问题。

【讨论】:

  • 是的,这大大减少了内存使用量。所以我可以写1个Mio。以前不可能的消息。
  • 您好,您能解释一下问题的原因吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 2016-02-04
  • 2016-12-19
相关资源
最近更新 更多