2

願わくば、この質問があまりにも自由回答式ではないことを願っています... 一言で言えば、データベースにすばやく簡単にアクセスできるスクリプトまたはプログラミング言語を探しています ( PostgreSQL)。

PostgreSQLデータベース内のいくつかのテーブルに対するクエリの結果を、R分析の入力として使用したいと考えています。クエリは単純なSELECTリクエストです (リクエストには改善の余地があるかもしれませんが、今のところ私はこのようには考えていません — 少し前に既に行っていました) が、最初のクエリの結果のループ内にあります。テーブルには数値と文字列の両方が含まれ、数十万行ではないにしても数千行になるため、クエリの総数は非常に大きくなる可能性があります。

明らかに、私は最初に をR使用してスクリプトを作成しRPostgreSQLました。ただ、使いこなすには時間がかかりすぎる(いつでも修正して再実行できるようにしたい)。このスクリプトはすでに非常に効率的に最適化されており、''system.time'' を見ると、ほとんどの時間がループ内の DB クエリに費やされていることがわかります。

次に、 の入力としてテキスト ファイルを使用した方がはるかに高速であることがわかったので、RこのRスクリプトをに変換することにpythonpsycopg2ました。残念ながら、pythonスクリプトはスクリプトよりもはるかに高速ではありませんR

C++最後に を使用してプログラムを書き始めlibpq-feましたが、柔軟性が十分ではないことがわかったのでやめました (つまり、クエリを処理するには、コードの行数を少なくとも 3 または 4 倍にする必要があります)。 .

したがって、DB アクセス (つまり、リスト、配列、文​​字列操作など) の速度と柔軟性 (クエリの結果に関しては、リスト、配列、文​​字列操作など) の間で最適な妥協点を提供するのはどの言語 (または他の言語Rやライブラリでしょうか?) ではないかと考えています。つまり、+や+よりもはるかに高速で、ほぼ「柔軟」である必要があります。pythonPostgreSQLRRPostgreSQLpythonpsycopg2

提案に感謝します (言語は Linux に適している必要があります)。


N+1更新 : これは、 Ryan と によって提案された問題のコードを修正した後、取得された最初の 500 要素のみを使用した古いコードと新しいコードの典型的なタイミングです。

> 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 

おそらく実際に変更する価値があります。;-)

4

1 に答える 1

2

データベースへのインターフェースを高速化するため。データベース クエリを最適化します。を使用して最適化されたコードでも発見したようRに、ほとんどの時間はデータベースで費やされました。そのため、最も慣れていて使い慣れているプログラミング言語を選択する必要があります。フロントエンドに関する限り、これが最速です。

ただし、使用するプログラミング言語に関係なく、全体的な結果 (知覚されるパフォーマンスの観点から) は同じです。純粋にデータベースの関数であるため、クエリの速度を上げることができるライブラリはありません。ライブラリ/言語でできることは、複数のクエリを 1 つのトランザクションに結合することだけですが、クエリの結果はデー​​タベースのレイアウトと最適化に依存します。

列にインデックスがないなどの単純なことが大きな影響を与える可能性があります。

クエリを実行することから始め、結果をこのツールEXPLAIN ANALYZEに貼り付けてデータベースの動作を視覚化し、どこから最適化を開始すればよいかがわかります。

于 2012-08-07T22:33:24.867 に答える