![](/img/trans.png)
[英]Mocked `fs.createFileSync` and `fs.unlinkSync` are not getting called
[英]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.