Лучший подход для скрипта для загрузки тысяч файлов в C #, SQL 2008 - PullRequest
2 голосов
/ 02 марта 2010

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

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

Есть ли лучший подход к этому, возможно, включающий многопоточность или асинхронные вызовы?

Ответы [ 6 ]

2 голосов
/ 02 марта 2010

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

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

2 голосов
/ 02 марта 2010

Threading, кажется, способ пойти .. у вас должен быть один или несколько потоков, которые читают строки из БД (если вам нужно много потоков, вы должны соответствующим образом разделить чтение) и помещать их в некий параллельный набор (встроенные .net 4 или встроенные скачать кастом). тогда у вас должна быть коллекция потоков, которая получит элементы из этого списка и получит файл; если он истечет время ожидания, он должен вернуть задачу обратно в коллекцию.

это базовый шаблон потоков производителя-потребителя. Вы можете легко найти много примеров в Google.

1 голос
/ 02 марта 2010

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

0 голосов
/ 02 марта 2010

Я бы не делал этот тип операции в скрипте. Вместо этого у меня была бы какая-то программа, вероятно, работающая как служба Windows, которая фактически выполняла бы задачу загрузки всех этих файлов и обновления соответствующих записей.

Если предполагается, что он запускается только тогда, когда пользователь нажимает кнопку, тогда у службы есть таблица для мониторинга выполнения команды. Как только она обнаружит эту команду, начните и начните.

Не уверен в названии шаблона здесь, но в основном это похоже на систему очередей заданий.

0 голосов
/ 02 марта 2010

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

0 голосов
/ 02 марта 2010

Можно ли сохранять результаты обратно в базу данных после каждой операции загрузки? Таким образом, вы можете сравнить строки двух таблиц, чтобы определить, где вы остановились в случае какого-либо таймаута или ошибки. Threading может сделать это быстрее, но это не решит проблему, о которой вы спрашивали самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...