Каков идеальный размер для FileSystemWatcher InternalBufferSize? - PullRequest
3 голосов
/ 16 марта 2012

У меня проблема с моим FileSystemWatcher.

У меня есть приложение, которое должно отслеживать большое, действительно большое количество файлов, созданных в папке за короткий промежуток времени.

Когда я начинаю его разрабатывать, яЯ понимаю, что многие файлы не были уведомлены, если размер моего буфера был меньше 64 КБ, что Microsoft рекомендует.Я пытался увеличить размер буфера до этого, пока не достиг значения, которое у меня работает, которое составляет 2621440 байт!

Что вы могли бы порекомендовать использовать для этого случая небольшого размера, или какой будет идеальный размербуфер?

Мой пример кода:

WATCHER = new FileSystemWatcher(SignerDocument.UnsignedPath, "*.pdf");
WATCHER.InternalBufferSize = 2621440; //Great and expensive buffer 2.5mb size!
WATCHER.IncludeSubdirectories = true;
WATCHER.EnableRaisingEvents = true;
WATCHER.Created += new FileSystemEventHandler(watcher_Created);
WATCHER.Renamed += new RenamedEventHandler(watcher_Renamed);

И что Microsoft говорит по этому поводу в .NET 2.0:

Увеличение размера буфера обходится дорого, поскольку оно приходитиз не выгружаемой памяти, которая не может быть выгружена на диск, поэтому сохраняйте буфер как можно меньше.Чтобы избежать переполнения буфера, используйте свойства NotifyFilter и IncludeSubdirectories для фильтрации нежелательных уведомлений об изменениях.ссылка: FileSystemWatcher.InternalBufferSize Свойство

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

Для такой огромной рабочей нагрузки вы можете выбрать метод периодической развертки вместо мгновенных уведомлений.Например, вы можете сканировать каталог каждые 5 секунд и обрабатывать добавленные файлы.Если вы переместите файл в другой каталог после его обработки, ваша периодическая рабочая нагрузка может даже стать минимальной.

Это также более безопасный подход, поскольку даже в случае сбоя кода обработки вы всегда можете восстановить, в отличие от уведомлений, ваша контрольная точка не сможетне потеряйся.

2 голосов
/ 03 сентября 2014

Вы можете установить размер буфера 4 КБ или более, но он не должен превышать 64 КБ. Если вы попытаетесь установить для свойства InternalBufferSize менее 4096 байт, ваше значение будет отброшено, а для свойства InternalBufferSize установлено значение 4096 байт. Для максимальной производительности используйте несколько компьютеров по 4 КБ на компьютерах с процессором Intel.

Из: http://msdn.microsoft.com/de-de/library/system.io.filesystemwatcher.internalbuffersize(v=vs.110).aspx

...