2013-02-19 3 views
0

Я могу проанализировать файлы журналов с компьютеров разных пользователей в сети. В любой день количество машин, которые должны быть считаны, может быть любым, где между 10K и 40K. Также после разбора файлов журнала я хотел бы сохранить результат каждого разбора (строка или 2) в общем месте (таблица базы данных или плоский файл). Лог-файлы сами по себе не так велики.
MultiThreading для чтения файлов

Что было бы самым элегантным и эффективным способом для этого?

Написать консольное приложение, использовать пул потоков и распределить задачи? Или есть ли более сложные решения/классы, доступные в C#?
or
Я не знаком с написанием служб Windows, но можно ли написать службу
развернуть ее на несколько компьютеров?
or
Любой другой подход?

+0

Поскольку узким местом почти наверняка будет жесткий диск, который не может обрабатывать более одного запроса одновременно, многопоточность чтения файла вряд ли поможет, и может даже пострадать. Многопоточность помогла бы только в том случае, если у вас много обработанных обработкой ЦП, которые вы делаете с данными в файле. – Servy

+0

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

ответ

0

Что было бы самым эффективным способом для этого?

Это для обсуждения - я осмелюсь сказать, что причиной этого является сообщение. Лично я бы пропустил чтение журналов на машине по машинной основе и сохранил результаты этих операций в конце SQL Server. Тем не менее, это сложный подход к производственной среде и может не применяться в зависимости от того, сколько усилий вы хотите внести.

В идеале это будет написано как отдельная служба Windows, а создание/отладка стала намного проще в более поздних версиях Visual Studio. Другим жизнеспособным подходом является создание консольного приложения, которое можно легко запустить и увидеть вывод. При развертывании вы можете использовать инструмент NSSM, чтобы консольное приложение могло работать как служба Windows. Это, пожалуй, наименее болезненный, но слегка неуклюжий метод - другие плакаты могут иметь более аккуратное решение.

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

Если вы хотите развернуть службу на каждой рассматриваемой машине и запустить ее локально (минуя всю многопоточную методологию, поскольку у вас есть один поток, проверяющий один набор файлов журнала в определенном расписании), то с SQL Задний конец сервера - это более простой способ, так как проще настроить учетную запись SQL Server и разрешить удаленные подключения к ней, чем настраивать общие папки папок на множестве компьютеров (я должен исправляться на thsi, поскольку я не являюсь домен admin). Недостатком этого является то, что если вам нужно обновить приложение, то обновление на каждой машине будет больно.

Это сводится к тому, какой подход лучше всего подходит для вашей ситуации? Единственное развертывание, требующее использования общих ресурсов компьютера или многоразвертывания с одним экземпляром SQL Server (или другим хранилищем данных)?

Смежные вопросы