gpt4 book ai didi

c# - 增加 FileSystemWatcher.InternalBufferSize 真的那么昂贵吗?

转载 作者:可可西里 更新时间:2023-11-01 08:55:16 25 4
gpt4 key购买 nike

我正在使用 FileSystemWatcher 来监视文件夹中的更改,但是一旦我在短时间内进行了数百次修改,我就会错过其中一些,因为内部缓冲区溢出.所以我想增加 InternalBufferSize(我知道它不会真正解决问题,但它会降低它发生的可能性),但我在 documentation 中看到了这个警告:

However, increasing buffer size is expensive, because it comes from non-paged memory that cannot be swapped out to disk, so keep the buffer as small as possible.

所以我的问题是:这真的重要吗?今天的大多数计算机至少有 1GB 的 RAM,所以在我看来,如果我将缓冲区大小设置为 1MB(而不是默认的 8KB),即使 1MB 不能换出到磁盘也没有关系。或者我错过了什么?我不太了解分页/非分页内存等低级内容,所以我不确定会产生什么影响......

最佳答案

分配缓冲区的内存当然是一种宝贵的资源。 Windows 不会很好地处理耗尽内存池的问题,驱动程序将开始随机失败。池的大小是动态设置的(但可以更改)并且取决于可用 RAM 的数量。

FSW 要求的默认缓冲区大小是 8192 字节。在现代机器上不多。底层 winapi 功能将不允许您要求超过 64KB。一个条目是缓冲区是 12 个字节加上文件路径的长度乘以二。更糟糕的情况是在缓冲区用完之前有 8192/(12 + 260*2) = 15 个通知。这应该在大多数情况下都可以正常工作,除非您监视整个驱动器或您正在监视的目录中的磁盘流量非常高。在这种情况下,要求更大的缓冲区是公平的。没有黄金公式,一定要实现 FileSystemWatcher.Error 事件,以便您知道您遇到了缓冲区问题。

在大多数实际情况下,您需要谨慎处理 FSW 事件。当进程仍然锁定文件时,它们将被引发。所以打开或复制文件之类的操作很麻烦。您通过将通知放在线程安全队列中来处理该问题,并使用另一个线程尝试获取文件上的锁,必要时可重复执行。这样的队列现在自动也是一个非常好的快速清空缓冲区的方法。您现在唯一需要注意的是,队列不会膨胀到超出合理比例,否则会使您的程序因 OOM 而崩溃。

关于c# - 增加 FileSystemWatcher.InternalBufferSize 真的那么昂贵吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com