2

[Python/MySQLdb] - CentOS - Linux - VPS

大きなファイルを解析し、実行ごとに最大 100 回データベースをクエリするページがあります。データベースはかなり大きいので、このスクリプトの実行時間を短縮しようとしています。

私の SQL 関数はクラス内にあります。現在、接続オブジェクトは、クラスがインスタンス化されるときに作成されるクラス変数です。呼び出されるたびに接続オブジェクトからカーソルを作成するさまざまなフェッチおよびクエリ関数があります。接続オブジェクトが作成されたときにカーソルを作成して再利用する方が速いでしょうか、それとも呼び出されるたびにカーソルを作成する方が良いでしょうか?

import MySQLdb as mdb
class parse:
    con = mdb.connect( server, username, password, dbname )
    #cur = con.cursor() ## create here?
    def q( self, q ):
        cur = self.con.cursor() ## it's currently here
        cur.execute( q )

スクリプトを高速化する方法に関するその他の提案も大歓迎です。挿入ステートメントは、スクリプト内のすべてのクエリで同じです。

4

1 に答える 1

2

接続の開閉は無料ではなく、常にある程度のパフォーマンスを浪費します。

接続を開いたままにしたくない理由は、2 つの要求が同時に着信した場合、最初の要求が完了するまで 2 番目の要求を待たなければならないためです。

これを解決する 1 つの方法は、接続プーリングを使用することです。開いている接続を多数作成してから、それらを再利用します。クエリを実行する必要があるたびに、プールから接続をチェックアウトし、リクエストを実行してからプールに戻します。

これらすべてを設定するのは非常に面倒なので、SQLAlchemyを使用することをお勧めします。接続プーリングが組み込まれており、オーバーヘッドが比較的低く、MySQL をサポートしています。

速度が気になるので、ORM 部分が少し遅いため、SQLAlchemy のコア部分のみを使用します。

于 2012-10-16T00:54:29.233 に答える