我有一个超过 12,000,000 行的 Posrgres 9.04 数据库表。
我需要一个程序来读取每一行,进行一些计算和查找(针对第二个表),然后在第三个表中写入一个带有这些计算结果的新行。完成后,第三张表的行数将与第一张表相同。
在 Core i7 720QM 处理器上串行执行需要超过 24 小时。它只对我的 8 个内核中的一个(4 个物理内核,但 8 个通过 HTT 对 Windows 7 可见)征税。
我想通过并行性来加快速度。我以为我可以使用 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”的查询模式的实现。未找到“选择”。考虑明确指定范围变量“行”的类型。
我已经做了很多谷歌搜索,我只是变得更加困惑。NpgsqlDataReader继承自System.Data.Common.DbDataReader,后者又实现了IEnumerable,它具有AsParallel扩展名,所以似乎有合适的东西来让它工作?
我不清楚我什至可以做什么来明确指定范围变量的类型。似乎最好的做法是不指定这一点。
我愿意切换到 DataSet,假设它与 PLINQ 兼容,但如果可能的话,我宁愿避免,因为有 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 中没有错误,但这是构建它的正确方法吗?