0

12,000,000 行を超える Posrgres 9.04 データベース テーブルがあります。

各行を読み取り、(2 番目のテーブルに対して) いくつかの計算とルックアップを実行し、これらの計算の結果を使用して 3 番目のテーブルに新しい行を書き込むプログラムが必要です。完了すると、3 番目のテーブルの行数は 1 番目のテーブルと同じになります。

Core i7 720QM プロセッサでシリアル実行すると、24 時間以上かかります。8 つのコアのうちの 1 つにのみ課税されます (物理コアは 4 つですが、HTT 経由で Wi​​ndows 7 に表示されるのは 8 つです)。

これを並列処理で高速化したい。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から継承します。これは、AsParallel拡張機能を持つIEnumerableを実装しているため、これを機能させるために適切なものが配置されているようです。

範囲変数の型を明示的に指定するために何ができるかは、私には明らかではありません。これを指定しないことをお勧めします。

PLINQ と互換性があると仮定して、DataSet への切り替えにオープンですが、12,000,000 行のため、可能であれば避けたいと思います。

これはNpgsqlで達成可能なものですか? 代わりに、Devart の dotConnect for 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 でエラーは発生していませんが、これはこれを構築する適切な方法ですか?

4

2 に答える 2

0

これは確かに解決策です:

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で見つけたものに触発されました. キャストと型の指定が必要な理由はわかりませんが、機能します。

編集:これは構文エラーや実行時エラーを引き起こしませんが、実際には物事を並行して実行することはありません。すべてまだシリーズ化されています。優れたソリューションについては、「 ConcurrentQueue の PLINQ はマルチスレッドではありません」を参照してください。

于 2011-05-09T02:06:29.027 に答える
-1

Greenplum の使用を検討する必要があります。これを Greenplum データベースで実現するのは簡単です。無料版は決して改ざんされておらず、そのコアは postgresql です。

于 2011-05-09T15:45:23.720 に答える