2

私の質問に対する答えとして: sqlite.fetchall() がとても遅いのは普通ですか? sqlite では、fetch-all と fetch-one が非常に遅くなる可能性があるようです。

そこで述べたように、次のクエリがあります。

time0 = time.time()
self.cursor.execute("SELECT spectrum_id, feature_table_id "+
                "FROM spectrum AS s "+
                "INNER JOIN feature AS f "+
                "ON f.msrun_msrun_id = s.msrun_msrun_id "+
                "INNER JOIN (SELECT feature_feature_table_id, min(rt) AS rtMin, max(rt) AS rtMax, min(mz) AS mzMin, max(mz) as mzMax "+
                             "FROM convexhull GROUP BY feature_feature_table_id) AS t "+
                "ON t.feature_feature_table_id = f.feature_table_id "+
                "WHERE s.msrun_msrun_id = ? "+
                "AND s.scan_start_time >= t.rtMin "+
                "AND s.scan_start_time <= t.rtMax "+
                "AND base_peak_mz >= t.mzMin "+
                "AND base_peak_mz <= t.mzMax", spectrumFeature_InputValues)
print 'query took:',time.time()-time0,'seconds'

time0 = time.time()
spectrumAndFeature_ids = self.cursor.fetchall()      
print time.time()-time0,'seconds since to fetchall'

select ステートメントの実行には約 50 秒かかります (許容範囲)。ただし、fetchall() には 788 秒かかり、981 件の結果しか取得できません。

私の質問への答えとして与えられたクエリを高速化するために提案された方法: sqlite.fetchall() がとても遅いのは普通ですか? fetchmany() を使用しても、結果の取得速度は向上しませんでした。

sqlite クエリを実行した後、結果のフェッチを高速化するにはどうすればよいですか?


コマンドラインで実行しようとしたのとまったく同じSQL:

sqlite> SELECT spectrum_id, feature_table_id
   ...> FROM spectrum AS s 
   ...> INNER JOIN feature AS f 
   ...> ON f.msrun_msrun_id = s.msrun_msrun_id 
   ...> INNER JOIN (SELECT feature_feature_table_id, min(rt) AS rtMin, max(rt) AS rtMax, min(mz) AS mzMin, max(mz) as mzMax 
   ...> FROM convexhull GROUP BY feature_feature_table_id) AS t 
   ...> ON t.feature_feature_table_id = f.feature_table_id 
   ...> WHERE s.msrun_msrun_id = 1
   ...> AND s.scan_start_time >= t.rtMin
   ...> AND s.scan_start_time <= t.rtMax
   ...> AND base_peak_mz >= t.mzMin
   ...> AND base_peak_mz <= t.mzMax;

アップデート:

そのため、約 45 分前にコマンドラインでクエリの実行を開始しましたが、まだビジーであるため、コマンドラインを使用すると非常に遅くなります。

4

1 に答える 1

2

この質問を読むと、 APSW sqlite モジュールを使用することでメリットが得られるように思えます。どういうわけか、SQLite モジュールの犠牲になって、パフォーマンスの低い方法でクエリが実行される可能性があります。

気になったのでapswを自分で使ってみました。それほど複雑ではありませんでした。試してみませんか?

それをインストールするには、次のことを行う必要がありました。

  1. 最新バージョンを抽出します。
  2. インストール パッケージに最新の sqlite 融合を取得させます。

    python setup.py fetch --sqlite
    
  3. ビルドしてインストールします。

    sudo python setup.py install
    
  4. 他の sqlite モジュールの代わりに使用します。

    import apsw
    <...>
    conn = apsw.Connection('foo.db')
    
于 2012-05-02T12:38:10.387 に答える