Tho*_*que 11 .net c# performance filesystemwatcher
我正在使用a FileSystemWatcher
监视文件夹中的更改,但是一旦我在短时间内进行了几百次修改,我就会错过其中一些因为内部缓冲区溢出.所以我想增加InternalBufferSize
(我知道它不会真正解决问题,但会降低它的可能性),但我在文档中看到了这个警告:
但是,增加缓冲区大小是很昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请尽可能减小缓冲区.
所以我的问题是:它真的重要吗?今天大多数计算机都有至少1GB的RAM,所以在我看来,如果我将缓冲区大小设置为1MB(而不是默认的8KB),那么1MB不能换成磁盘就不重要了.或者我错过了什么?我不太了解低级别的东西,如分页/非分页内存,所以我不确定会有什么影响...
Han*_*ant 19
分配缓冲区的内存当然是一种宝贵的资源.Windows不会处理内存池耗尽,驱动程序将随机启动失败.池的大小是动态设置的(但可以更改),取决于可用RAM的数量.
FSW要求的默认缓冲区大小为8192字节.在现代机器上并不多.底层的winapi功能不允许您要求超过64KB.一个条目是缓冲区是12个字节加上文件路径的长度乘以2个.更糟糕的情况是在缓冲区用完之前8192 /(12 + 260*2)= 15个通知.除非您监视整个驱动器或在您正在观看的目录中拥有非常高的磁盘流量,否则这应该在大多数情况下都可以正常工作.在这种情况下,要求更大的缓冲是公平的.没有黄金公式,请确保实现FileSystemWatcher.Error事件,以便您知道存在缓冲区问题.
在大多数实际情况中,您需要仔细处理FSW事件.当进程仍然锁定文件时,它们将被引发.因此,打开或复制文件等操作很麻烦.您可以通过将通知放在线程安全队列上并使用另一个线程尝试获取文件锁定(如有必要)重复处理.现在,这样的队列自动也是快速清空缓冲区的好方法.你现在唯一要注意的是,队列不会爆炸超过合理的比例,这将使你的程序崩溃与OOM.