У меня есть таблица базы данных Posrgres 9.04 с более чем 12 000 000 строк.
Мне нужна программа для чтения каждой строки, выполнения некоторых вычислений и поиска (по 2-й таблице), а затем записи новой строки в 3-й таблице с результатами этих вычислений. Когда это будет сделано, в 3-й таблице будет столько же строк, сколько в 1-й таблице.
Выполнение серийно на процессоре Core i7 720QM занимает более 24 часов. Он облагает налогом только одно из моих 8 ядер (4 физических ядра, но 8 видимых для Windows 7 через HTT).
Я хочу ускорить это с помощью параллелизма. Я думал, что смогу использовать PLINQ и Npgsql:
NpgsqlDataReader records = new NpgsqlCommand("SELECT * FROM table", conn).ExecuteReader();
var single_record = from row in records.AsParallel()
select row;
Однако я получаю сообщение об ошибке для records.AsParallel()
: Не удалось найти реализацию шаблона запроса для типа источника 'System.Linq.ParallelQuery'. «Выбрать» не найдено. Рассмотрим явное указание типа переменной диапазона 'row'.
Я провел много поисков в Google, и я просто запутался. NpgsqlDataReader наследуется от System.Data.Common.DbDataReader , который, в свою очередь, реализует IEnumerable , который имеет расширение AsParallel , так выглядит правильные вещи на месте, чтобы это работало?
Мне не ясно, что я мог бы сделать, чтобы явно указать тип переменной диапазона. Похоже, что лучше всего указывать это , а не .
Я готов переключиться на DataSet, предполагая, что он совместим с PLINQ, но, скорее всего, по возможности избежал бы из-за 12 000 000 строк.
Это даже что-то достижимое с Npgsql? Нужно ли использовать DevCon's dotConnect для PostgreSQL вместо этого?
ОБНОВЛЕНИЕ: Только что нашел http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/2f5ce226-c500-4899-a923-99285ace42ae,, что побудило меня попробовать это:
foreach(IDataRecord arrest in
from row in arrests.AsParallel().Cast <IDataRecord>()
select row)
Пока нет ошибок в IDE, но это правильный способ построения этого?