У меня есть C# консольное приложение работает на 64-битной Windows Server 2008 R2, который также размещен MSSQL Server 2005.Как правильно дросселировать многопоточное приложение?
Это приложение работает с помощью текстовых файлов, читает строку, разбивает строки значения в переменные, и вставляет данных в базу данных SQL, размещенную на локальном хосте.
Каждый текстовый файл представляет собой новый поток, каждая строка представляет собой новый поток, и каждый оператор вставки SQL выполняется под новым потоком.
Я подсчитываю количество каждого из этих типов потоков и уменьшаю их при завершении. Я задаюсь вопросом, что лучший способ заключается в «ПЭНД» будущие потоки от открытия ...
Например .. перед открыт новый SQL вставить нить я звоню ...
while(numberofcurrentthreads > specifiednumberofthreads)
{
// wait
}
new.Thread(insertSQL);
Если указано, что количество предметов было оценено до значения, которое не выбрасывает System.OutofMemoryExceptions. Большая часть угадывания занялась определением этого числа для каждого процесса.
Мои вопросы: есть ли более «эффективный» или правильный способ сделать это? Есть ли способ читать системную память, а не физическую память, и ждать, основываясь на заданном распределении ресурсов?
Чтобы проиллюстрировать эту идею ...
while(System.Memory < (System.Memory/2) || System.OutofMemory == true)
{
// wait
}
new.Thread(insertSQL);
Текущий метод Я с использованием работы и завершается в приличное время .. но это может сделать лучше. Некоторые текстовые файлы, проходящие через процесс, больше других и не обязательно наилучшим образом используют системные ресурсы ...
В примере, если я говорю текстовые файлы процесса 2 одновременно, что отлично работает, когда оба текста файлы: < 300KB. Это не работает так хорошо, если один или два более 100 000 КБ.
Там также, кажется, «масло-зона», где все происходит наиболее эффективно. Где-то в среднем около 75% всех ресурсов ЦП. Выверните эти значения слишком высоко, и он будет работать на 100% CPU, но процесс медленнее, поскольку он не может идти в ногу.
Существует буквально целая книга, написанная на эту тему, где сумма ответов «зависит от». –
Похоже, что это лучше всего решить путем выбора размеров. Задайте максимальное количество потоков и узнайте, какая настройка работает лучше всего. – Thilo
Создание и уничтожение потоков дорого, подумайте об использовании пула потоков вместо ... или даже встроенного пула потоков .net. Возможно, вы захотите взглянуть на ThreadPool.QueueUserWorkItem: http://msdn.microsoft.com /en-us/library/system.threading.threadpool.queueuserworkitem(v=vs.110).aspx – KristoferA