Есть необходимость увеличить производительность опеределённых расчётов в старой системе.
Есть таблица, в которой могут быть несколько миллионов записей.
Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
Поделитесь опытом решения подобных задач.
Здравствуйте, igor609, Вы писали:
I>Есть необходимость увеличить производительность опеределённых расчётов в старой системе.
I>Есть таблица, в которой могут быть несколько миллионов записей.
I>Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
I>Поделитесь опытом решения подобных задач.
Ну для начало нужно определить какой простаивающий ресурс хотите задействовать в дополнительных потоках. Может его и нет ещё.
А потом проектировать.
Здравствуйте, igor609, Вы писали:
I>Есть необходимость увеличить производительность опеределённых расчётов в старой системе.
I>Есть таблица, в которой могут быть несколько миллионов записей.
I>Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
I>Поделитесь опытом решения подобных задач.
См PFX, Parallel.For
http://habrahabr.ru/blogs/net/104103/#habracut
Здравствуйте, Tom, Вы писали:
Tom>Здравствуйте, igor609, Вы писали:
I>>Есть необходимость увеличить производительность опеределённых расчётов в старой системе.
I>>Есть таблица, в которой могут быть несколько миллионов записей.
I>>Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
I>>Поделитесь опытом решения подобных задач.
Tom>См PFX, Parallel.For
Tom>http://habrahabr.ru/blogs/net/104103/#habracut
Большое спасибо за сылку.
Это особенно понравилось, попробую на практике.
Parallel.ForEach(Partitioner.Create(from, to), range =>
{
for (int i = range.Item1; i < range.Item2; i++)
{
result[i] = i*i;
}
});