![](/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.