Падение FileSystemWatcher и SQLite в приложении WPF

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

Я закодировал все в WPF/C# с ​​базовой базой данных SQLite, и я уверен, что наблюдатели за папками будут хорошо работать при «небольших нагрузках», но проблема в том, что мы используем TortoiseSVN, и когда пользователь выполняет обновление SVN и т. д., что создает тяжелая файловая загрузка обновлений FileSystemWatcher и SQLite просто не справляется (даже с максимальным размером буфера). В основном я делаю вставку в базу данных каждый раз, когда происходит событие наблюдателя.

Итак, мой главный вопрос: есть ли у кого-нибудь предложения о том, как реализовать этот файловый наблюдатель для обработки таких больших нагрузок?

Вот некоторые мысли, которые у меня были: (1) Создайте промежуточную коллекцию для всех запросов и используйте таймер и поток для вставки данных позже (2) Запишите запросы в файл и позже используйте поток таймера для вставки.

Помощь....


person theDoke    schedule 21.12.2011    source источник


Ответы (3)


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

person dmarietta    schedule 22.12.2011

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

см. http://www.c-sharpcorner.com/UploadFile/rajkpt/101262007012217AM/1.aspx

Затем создайте отдельный WorkerThread, который берет предопределенное количество элементов из очереди и вставляет их в базу данных. Здесь я бы предложил объединить отдельные вставки в объемную вставку. Если вы хотите быть на 100% уверены, вы можете проверить производительность процессора и ввода-вывода перед вставкой. Вот фрагмент кода для определения загрузки процессора:

Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount
person SvenG    schedule 22.12.2011

Проще всего запустить обновление по таймеру (скажем, на одну минуту). Если тем временем приходит другое обновление, вы ставите изменение в очередь и перезапускаете таймер. Только когда пройдет минута бездействия, вы начнете обрабатывать.

person Stu    schedule 22.12.2011
comment
(Обратите внимание, это работает только в том случае, если в вашей системе есть значительное время простоя, конечно) - person Stu; 22.12.2011