为了账号安全,请及时绑定邮箱和手机立即绑定

当您删除由 nodejs 中的 fs 模块作为 writeStream 打开的文件时会发生什么?

当您删除由 nodejs 中的 fs 模块作为 writeStream 打开的文件时会发生什么?

千万里不及你 2022-06-16 17:05:34
我正在下载一些文件并将其写入一个以 writeStream 打开的文件,但是当我尝试删除它时,它被删除了,但 fs 仍在做它的工作,但无处可写......那个缓冲区去哪儿了?当我删除它正在写入的那个文件时
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

如果您使用的是 UN*Xy 操作系统,则删除的文件将继续存在,直到所有打开的文件描述符都关闭。它存在,但没有名字。

如果指向的文件被移动或删除,Linux 上打开的文件句柄会发生什么”给出了 Linux 的详细信息。


查看完整回答
反对 回复 2022-06-16
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

我认为一般的答案是 JS 只是将写入数据块保留在堆中,并在其垃圾收集机制下在适当的时候释放它们。

写入数据块可能是一种类型<string> | <Buffer> | <Uint8Array> ...,也许你想看看 API Buffer.allocUnsafeSlow(size),它提到:

当使用 Buffer.allocUnsafe() 分配新的 Buffer 实例时,4KB 以下的分配是从单个预分配的 Buffer 中切片的。这允许应用程序避免创建许多单独分配的 Buffer 实例的垃圾收集开销。

根据这一段,您可以通过另一个方法Buffer.alloc()在 Node 引擎的垃圾收集下推断为Buffer(这是我上面提到的类型之一)分配内存。

JS Object 的内存处理在堆中。createStream必须先打开dest文件的数据并将其加载到堆/内存中,即使是这样的方法,writeStream.write()也不是直接对文件/磁盘做I/O,它必须在内存中逐块处理数据首先,然后用最少的次数将其写入磁盘,所以当dest文件没有了时,可能这种方法的做法只是将这些数据块保留在堆中,然后看看什么时候释放它们的好时机。

与dest文件仍然存在的情况相比,我认为没有太大区别,它最终会为那些数据清理内存。

如果您想了解更多关于 Node 引擎中的垃圾收集:a-tour-of-v8-garbage-collection


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信