0

我有一个超过 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 中没有错误,但这是构建它的正确方法吗?

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 is not multithreading以获得更好的解决方案。

于 2011-05-09T02:06:29.027 回答
-1

您应该考虑使用 Greenplum。在 Greenplum 数据库中完成这一点很简单。免费版本没有任何形式的限制,它的核心是 postgresql。

于 2011-05-09T15:45:23.720 回答