12,000,000 行を超える Posrgres 9.04 データベース テーブルがあります。
各行を読み取り、(2 番目のテーブルに対して) いくつかの計算とルックアップを実行し、これらの計算の結果を使用して 3 番目のテーブルに新しい行を書き込むプログラムが必要です。完了すると、3 番目のテーブルの行数は 1 番目のテーブルと同じになります。
Core i7 720QM プロセッサでシリアル実行すると、24 時間以上かかります。8 つのコアのうちの 1 つにのみ課税されます (物理コアは 4 つですが、HTT 経由で Windows 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 でエラーは発生していませんが、これはこれを構築する適切な方法ですか?