簡體   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