繁体   English   中英

NodeJS fs.unlinkSync 没有释放 aws ec2 服务器上的硬盘空间

[英]NodeJS fs.unlinkSync not freeing up hard-drive space on aws ec2 server

我在 Elastic Beanstalk 上有一个 NodeJS 应用程序。

我正在下载大量大 zip,打开并处理它们,然后通过fs.unlinkSync删除 zip 文件

测试时我看到文件被删除,但显然 unlink 在进程使用它时实际上不会释放空间?

如何指示 fs 释放 memory 分配?

我正在通过写文件

let writeStream = fs.createWriteStream(file.name);
writeStream.on('finish', () => {
  // a bunch of logic that eventually returns a promise

并在其解决/拒绝中

fs.unlinkSync(file.name)

我已经完成了,这是我唯一一次触摸文件,其他所有内容都已关闭。 我需要等待 writeStream 关闭的其他事件吗?

-- 充分解释工作流程

for (let i = 0; i < records.length; i++) {
  await processZip(records[i]);
  fs.unlinkSync(records[i].name);
}

在 processZip 方法中

return new Promise(async (resolve, reject) => {

  var readStream = this.s3Access.getObjectStream(guid);
  let writeStream = fs.createWriteStream(file.name);
  readStream.pipe(writeStream);

  writeStream.on('finish', () => {
    resolve();
  }
}

根据 NodeJS 文档unlinkSync()正在调用 C/C++ API 调用unlink

这是文档在这里所说的

unlink() 从文件系统中删除一个名称。 如果该名称是文件的最后一个链接,并且没有进程打开该文件,则该文件将被删除,并且它正在使用的空间可供重用。

如果名称是文件的最后一个链接,但任何进程仍然打开该文件,则该文件将一直存在,直到引用它的最后一个文件描述符关闭。

如果名称引用了符号链接,则删除该链接。

如果名称引用了套接字、FIFO 或设备,则删除它的名称,但打开 object 的进程可以继续使用它。

基本上应该关闭所有链接以删除文件。

尝试考虑可能使用您尝试删除的文件的其他进程(使用fs.open/openSync()打开但未关闭的文件等)

更新

processZip返回的processZip解析成功后,文件似乎被删除了。

如果 promise 被拒绝(即异步函数中抛出错误),删除该文件也会很有用。

for (let i = 0; i < records.length; i++) {
  try {
    await processZip(records[i]);
  } finally {
    // delete file after success or error
    fs.unlinkSync(records[i].name);
  }
}

此外,可以将'error'事件处理程序添加到processZip中的两个流中。

我在stream.pipe() docs中找到了这个注释,可能与问题有关:

一个重要的警告是,如果Readable stream 在处理过程中发出错误, Writable目标不会自动关闭。 如果发生错误,则需要手动关闭每个 stream 以防止 memory 泄漏。

return new Promise(async (resolve, reject) => {

  var readStream = this.s3Access.getObjectStream(guid);
  let writeStream = fs.createWriteStream(file.name);
  readStream.pipe(writeStream);

  writeStream.on('finish', () => {
    resolve();
  }

  readStream.on('error', err => {
    readStream.end();
    writeStream.end();
    reject(err);
  }

  writeStream.on('error', err => {
    readStream.end();
    writeStream.end();
    reject(err);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM