Postgresql 与Postgres和Npgsql的并行性或PLINQ

Postgresql 与Postgres和Npgsql的并行性或PLINQ,postgresql,c#-4.0,parallel-processing,plinq,npgsql,Postgresql,C# 4.0,Parallel Processing,Plinq,Npgsql,我有一个Posrgres 9.04数据库表,包含超过12000000行 我需要一个程序来读取每一行,对第二个表进行一些计算和查找,然后在第三个表中用这些计算的结果写一个新行。完成后,第三个表的行数将与第一个表的行数相同 在核心i7 720QM处理器上串行执行需要24小时以上。它只对我的8个内核中的一个(4个物理内核)征税,但对Windows 7通过HTT可见的8个内核征税 我想用并行来加速这个过程。我想我可以使用PLINQ和Npgsql: NpgsqlDataReader records = n

我有一个Posrgres 9.04数据库表,包含超过12000000行

我需要一个程序来读取每一行,对第二个表进行一些计算和查找,然后在第三个表中用这些计算的结果写一个新行。完成后,第三个表的行数将与第一个表的行数相同

在核心i7 720QM处理器上串行执行需要24小时以上。它只对我的8个内核中的一个(4个物理内核)征税,但对Windows 7通过HTT可见的8个内核征税

我想用并行来加速这个过程。我想我可以使用PLINQ和Npgsql:

NpgsqlDataReader records = new NpgsqlCommand("SELECT * FROM table", conn).ExecuteReader();
var single_record = from row in records.AsParallel()
             select row;
但是,我收到一个记录错误。AsParallel:找不到源类型“System.Linq.ParallelQuery”的查询模式的实现选择“未找到”。考虑显式指定范围变量“行”的类型。

我已经做了很多谷歌搜索,我只是变得更加困惑。NpgsqlDataReader继承自System.Data.Common.DbDataReader,后者又实现了IEnumerable,IEnumerable具有AsParallel扩展,因此似乎已经准备好了正确的东西来实现这个功能

我甚至不清楚如何显式指定范围变量的类型。看来,最佳做法是不指定这一点

我愿意切换到数据集,假定它与PLINQ兼容,但如果可能的话,我宁愿避免,因为有12000000行

这甚至可以通过Npgsql实现吗?我是否需要使用Devart的dotConnect for PostgreSQL

更新:刚找到,这让我尝试了以下方法:

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

到目前为止,IDE中没有错误,但这是构建此IDE的正确方法吗?

这确实是解决方案:

foreach(IDataRecord arrest in
        from row in arrests.AsParallel().Cast <IDataRecord>()
        select row)
这个解决方案的灵感来自于我在。我不清楚为什么需要cast和type规范,但它是有效的


编辑:虽然这不会导致语法或运行时错误,但实际上不会使事情并行运行。一切仍然是序列化的。请看一个好的解决方案。

< P>你应该考虑使用绿叶。在Greenplum数据库中实现这一点很简单。免费版本没有任何限制,它的核心是postgresql

我可能在胡说八道,但您是否尝试过使用.NET4.0版本的Npgsql。它是根据EF编译的,EF可以为您提供Linq支持。“我希望这会有帮助。”方济各-谢谢。是的,我正在使用Npgsql2.0.11.91-bin-ms.net4.0.zip中的DLL。在VisualStudio2010中,DLL的Runtime Version字段为v4.0.30319.Hmmmmm,那么为了使AsParallel正常工作,Npgsql内部可能需要一些支持。我会看看如何做到这一点,并会让你知道。刚刚看到你的编辑。到现在为止它是怎么涨的。您是否从中获得性能优势?谢谢。我试图在我的应用程序中实现并行性,而不是在数据库中。本地Postgres应该根据需要自动使用多个核心。明白了。从数据库中取出数据不会损失任何性能?