2011-05-07 49 views
0

我有Posrgres 9.04數據庫表超過12,000,000行。Postgres和Npgsql並行或PLINQ

我需要一個程序來讀取每一行,做一些計算和查找(針對第2臺),然後寫在第3表中的新行,這些計算的結果。完成後,第三個表的行數將與第一個表的行數相同。

上的酷睿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」的查詢模式的實現。 '選擇'未找到。考慮顯式指定範圍變量'row'的類型。

我已經做了很多的谷歌搜索,我只是來了更多的困惑。 NpgsqlDataReaderSystem.Data.Common.DbDataReader,進而實現IEnumerable的,它具有進行AsParallel擴展,所以似乎是一個正確的東西繼承是在地方得到這個工作?

這不是很清楚,我什麼,我甚至可以做明確指定的範圍變量的類型。看來最好的做法是而不是來指定這個。

我願意切換到DataSet中,假設這是PLINQ兼容,但寧願避免,如果可能的,因爲1200萬行。

這甚至可以用Npgsql實現嗎?我需要使用Devart的dotConnect for PostgreSQL嗎?

UPDATE:剛發現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中沒有錯誤,但這是構建這種有道?

+0

我可能會說廢話,但你是否嘗試使用Npgsql的.net 4.0版本。它是針對可以給你Linq支持的EF編譯的。我希望它有幫助。 – 2011-05-07 22:55:55

+0

@FranciscoJunior - 謝謝。是的,我使用** Npgsql2.0.11中的DLL。91-bin-ms.net4.0.zip **。在Visual Studio 2010中,DLL的** Runtime Version **字段是** v4.0.30319 **。 – 2011-05-08 02:41:39

+0

嗯,那麼也許爲了讓AsParallel工作,Npgsql裏可能需要一些支持。我會檢查如何做到這一點,並會讓你知道。剛看到你的編輯。它到目前爲止如何。你是否從中獲得了性能優勢? – 2011-05-08 16:48:11

回答

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啓發。我不清楚爲什麼需要演員和類型規範,但它是有效的。

編輯:雖然這不會導致語法或運行時錯誤,它實際上並沒有讓事情並行運行。一切仍然是序列化的。請參閱PLINQ on ConcurrentQueue isn't multithreading以獲得更好的解決方案。

-1

你應該考慮使用Greenplum。在Greenplum數據庫中完成這件事很簡單。免費版本並沒有以任何方式吝嗇,它的核心是postgresql。

+0

謝謝。我試圖在我的應用程序中實現並行性,而不是在數據庫中。本地Postgres應該根據需要自動使用多個內核。 – 2011-05-09 16:19:46

+0

明白了。通過將數據從數據庫中「拉出」,您不會失去任何性能? – user677325 2011-05-12 22:48:03