Эффективное разпараллеливание
От: igor609  
Дата: 06.12.10 11:27
Оценка:
Есть необходимость увеличить производительность опеределённых расчётов в старой системе.
Есть таблица, в которой могут быть несколько миллионов записей.
Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
Поделитесь опытом решения подобных задач.
Re: Эффективное разпараллеливание
От: Аноним  
Дата: 08.12.10 08:40
Оценка:
Здравствуйте, igor609, Вы писали:

I>Есть необходимость увеличить производительность опеределённых расчётов в старой системе.

I>Есть таблица, в которой могут быть несколько миллионов записей.
I>Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
I>Поделитесь опытом решения подобных задач.


Ну для начало нужно определить какой простаивающий ресурс хотите задействовать в дополнительных потоках. Может его и нет ещё.
А потом проектировать.
Re: Эффективное разпараллеливание
От: Tom Россия http://www.RSDN.ru
Дата: 08.12.10 09:23
Оценка: 3 (1)
Здравствуйте, igor609, Вы писали:

I>Есть необходимость увеличить производительность опеределённых расчётов в старой системе.

I>Есть таблица, в которой могут быть несколько миллионов записей.
I>Есть for, который перебирает последовательно строчку за строчкой, производит сложные расчёты (с использованием внешних систем) и сохраняет пересчитанные даныые обратно в базу данных. Процесс долгий, хотелось бы перебрать строчки параллельно. Первое, что приходит в голову, это открыть одновременно, определённое количество threads и поделить между ними все записи таблицы. Минус надо подбирать эффективное количество threads, что не очень-то хочется. Наверное правильнее использовать TPL.
I>Поделитесь опытом решения подобных задач.

См PFX, Parallel.For

http://habrahabr.ru/blogs/net/104103/#habracut
Народная мудрось
всем все никому ничего(с).
Re[2]: Эффективное разпараллеливание
От: igor609  
Дата: 08.12.10 16:40
Оценка:
Здравствуйте, 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;
        }
});
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.