Параллелизм или PLINQ с Postgres и Npgsql - PullRequest
0 голосов
/ 08 мая 2011

У меня есть таблица базы данных 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, но это правильный способ построения этого?

Ответы [ 2 ]

0 голосов
/ 09 мая 2011

Вы должны рассмотреть возможность использования Greenplum.Это легко сделать в базе данных Greenplum.Бесплатная версия никоим образом не связана, и в ее основе лежит postgresql.

0 голосов
/ 09 мая 2011

Это действительно решение:

foreach(IDataRecord arrest in
        from row in arrests.AsParallel().Cast <IDataRecord>()
        select row)

Это решение было вдохновлено тем, что я нашел на http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/2f5ce226-c500-4899-a923-99285ace42ae#1956768e-9403-4671-a196-8dfb3d7070e3. Мне не понятно, зачем нужна спецификация приведений и типов, но это работает.

РЕДАКТИРОВАТЬ: Хотя это не вызывает синтаксические ошибки или ошибки во время выполнения, на самом деле это не заставляет вещи работать параллельно. Все еще сериализовано. См. PLINQ на ConcurrentQueue, не многопоточность для превосходного решения.

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