亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當您刪除由 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 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號