希望這個問題不是太多開放式......簡而言之:我正在尋找一種腳本或編程語言,可以快速但容易地訪問數據庫(PostgreSQL
)。快速靈活的語言(PostgreSQL)數據庫訪問?
我想使用PostgreSQL
數據庫中的某些表上的查詢結果作爲某些R
分析的輸入。查詢是簡單的SELECT
請求(請求中可能有改進空間,但目前我沒有這種方式 - 我已經做了一段時間),但在第一個查詢的結果循環內。表格包含數字和字符串,並且如果不是數十萬行,則是數以千計,所以查詢的總數可能非常大。
顯然我首先用RPostgreSQL
寫了一個R
腳本。但是,使用起來需要很長時間(我希望能夠隨時修改和重新運行)。我已經非常有效地優化了這個腳本,''system.time''顯示我大部分時間都花在循環中的DB查詢上。
然後,我想通了,這將是更快的方式,如果我用一個文本文件作爲輸入R
,我決定把這個R
腳本翻譯成python
,使用psycopg2
。不幸的是,python
腳本的速度並不比R
腳本快得多。
最後我開始用libpq-fe
寫一個C++
程序,但我停下來,因爲我發現它不夠靈活(我的意思是,我必須將我的代碼的行數乘以至少3或4爲了處理查詢)。因此,我想知道哪種語言(或者其他R
或python
庫?)能夠在數據庫訪問(即查詢結果:列表,數組,字符串操作等)方面提供最佳的速度和靈活性之間的妥協,PostgreSQL
)。也就是說,它需要比R
+ RPostgreSQL
和python
+ psycopg2
快得多,並且幾乎和「靈活」一樣。
感謝您的建議(語言必須是Linux友好的)。
更新:這裏是僅使用第一500個檢索元件,校正所述N+1
問題代碼之後舊與新的代碼的一個典型的定時由Ryan和建議:
> system.time(source("oldcode.R"));
user system elapsed
3.825 0.052 49.363
> system.time(source("newcode.R"));
user system elapsed
1.920 0.140 3.551
的1000首次檢索元素相同:
> system.time(source("oldcode.R"));
user system elapsed
9.816 0.092 100.340
> system.time(source("newcode.R"));
user system elapsed
5.040 0.072 6.695
確實值得一改。 ;-)
搜索並閱讀「N + 1選擇問題」。 – 2012-08-08 23:33:46
事實上,我似乎陷入了這個陷阱。所以如果我理解正確的話,我應該假定數據庫比我用於分析從數據庫中獲得的數據的編程語言慢得多。也就是說,代替對數據庫的N + 1請求,我應該只執行一個大的請求,轉儲我需要的所有數據,然後在包含所有這些數據的對象上的代碼中循環。 – 2012-08-19 14:49:56
正確。更準確地說,假設數據庫具有較高的*延遲*(相對於您的編程語言而言);這就是爲什麼N 1行查詢比1 N行查詢更昂貴的原因。 – 2012-08-19 18:31:46