Pandas: to_sqlが遅すぎる

作成日 2017年02月01日  ·  24コメント  ·  ソース: pandas-dev/pandas

コードサンプル、

df_name.to_sql('table_name',
                          schema = 'public',
                          con = engine,
                          index = False,
                          if_exists = 'replace')

問題の説明

500,000行のデータフレームをpostgresAWSデータベースに書き込んでいますが、データをプッシュするのに非常に長い時間がかかります。

それはかなり大きなSQLサーバーであり、私のインターネット接続は優れているので、問題の原因であるとしてそれらを除外しました。

比較すると、csv2sqlまたはcatを使用して、コマンドラインでpsqlにパイプする方がはるかに高速です。

IO SQL Usage Question

最も参考になるコメント

このコードをengine = create_engine(connection_string)下に追加します:

from sqlalchemy import event

@event.listens_for(e, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
        cursor.commit()

私のコードでは、 to_sql関数の実行に7分かかっていましたが、今では5秒しかかかりません;)

全てのコメント24件

ここを参照してください: http

SQLServerでは、効率を上げるために一括アップロードでcsv経由でインポートする必要があります

あなたはこれが役に立つと思うかもしれません: http

ODOは機能しません修正できなかったエラーが生成されますが、d6tstackは正常に機能しました

このコードをengine = create_engine(connection_string)下に追加します:

from sqlalchemy import event

@event.listens_for(e, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
        cursor.commit()

私のコードでは、 to_sql関数の実行に7分かかっていましたが、今では5秒しかかかりません;)

ありがとう@llautert!
それは大いに役立ちました!

# dont forget to import event
from sqlalchemy import event, create_engine

engine = create_engine(connection_string)

@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
        cursor.commit()

この修正を実行しようとしましたが、エラーメッセージが表示されます。

AttributeError: 'psycopg2.extensions.cursor' object has no attribute 'fast_executemany'

誰が何が起こっているのか知っていますか?

ちょっと@ tim-sauchuk、同じエラーが発生しましたが、pandas.io.sql.pyファイルを少し編集することを含むうまく機能している解決策を見つけました(再度インポートする前に__pycache__から.pycファイルを削除するだけです)圧縮ファイルに新しいバージョンが書き込まれることを確認するため)

https://github.com/pandas-dev/pandas/issues/8953

ちょっと@ tim-sauchuk、同じエラーが発生しましたが、pandas.io.sql.pyファイルを少し編集することを含むうまく機能しているソリューションを見つけました(再度インポートする前にpycacheから.pycファイルを削除するだけです)圧縮ファイルに新しいバージョンが書き込まれることを確認するため)

8953

@ bsaunders23が言及した問題#8953は、「モンキーパッチ」(実行時に修正する)の方法も示しています。 私はそれを試しましたが、アップロードに10分以上かかった20kのデータセットは、わずか4秒しかかかりませんでした。

ありがとう@llautert!
それは大いに役立ちました!

# dont forget to import event
from sqlalchemy import event, create_engine

engine = create_engine(connection_string)

@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
        cursor.commit()

self.engineインスタンスを使用してクラス内にこのソリューションを実装する方法を知っている人はいますか?

self.engineインスタンスを使用してクラス内にこのソリューションを実装する方法を知っている人はいますか?

self.engineすることで私のために働きます

例:

    self.engine = sqlalchemy.create_engine(connectionString, echo=echo)
    self.connection = self.engine.connect()

    @event.listens_for(self.engine, 'before_cursor_execute')
    def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
        print("Listen before_cursor_execute - executemany: %s" % str(executemany))
        if executemany:
            cursor.fast_executemany = True
            cursor.commit()

私には効きません。 どのパンダとsqlalchemyバージョンを使用していますか?

sqlalchemyを実行してみました:1.2.4-py35h14c3975_0および1.2.11-py35h7b6447c_0

しかし、私は得ています

AttributeError: 'psycopg2.extensions.cursor'オブジェクトに属性がありません 'fast_executemany'

@ dean12 @llautert

このコンテキストでは、関数呼び出しはどのように見えますか? つまり、テーブルを正常にアップロードするための引数に何を使用していますか?

<# dont forget to import event
from sqlalchemy import event, create_engine

engine = create_engine(connection_string)

@event.listens_for(engine, 'before_cursor_execute')
def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
    if executemany:
        cursor.fast_executemany = True
        cursor.commit()>``

ここを参照してください: https

sqlalchemyを実行してみました:1.2.4-py35h14c3975_0および1.2.11-py35h7b6447c_0

しかし、私は得ています

AttributeError: 'psycopg2.extensions.cursor'オブジェクトに属性がありません 'fast_executemany'

postgresqlドライバーであるpsycopg2を使用しています。 この問題と修正は、pyodbcドライバーを使用するMicrosoft SQLServerに関連しています。

'dtype'パラメータを追加するのはどうですか

self.engineインスタンスを使用してクラス内にこのソリューションを実装する方法を知っている人はいますか?

self.engineすることで私のために働きます

例:

    self.engine = sqlalchemy.create_engine(connectionString, echo=echo)
    self.connection = self.engine.connect()

    @event.listens_for(self.engine, 'before_cursor_execute')
    def receive_before_cursor_execute(conn, cursor, statement, params, context, executemany):
        print("Listen before_cursor_execute - executemany: %s" % str(executemany))
        if executemany:
            cursor.fast_executemany = True
            cursor.commit()

方法を見つけましたか?

pandas dataframeを節約しようとしている場合、正解はhttps://docs.sqlalchemy.org/en/13/dialects/postgresql.html#psycopg2-batch-mode-fast-executionを使用することだと思いますpandas dataframeからpostgres

パンダの新しいバージョンには、「マルチ」として選択できるmethodパラメーターが含まれています。 これにより、コードの実行がはるかに高速になります。

fast_executemanyを1つのステップで実行できるようになりました(sqlalchemy> = 1.3.0):

engine = sqlalchemy.create_engine(connection_string, fast_executemany=True)

たぶん、ドキュメントのどこかで、または例でそれを言及する価値がありますか? これはパンダとは関係のない特定のケースですが、多くの場合、パフォーマンスを大幅に向上させる可能性のある小さな追加です。

パンダの新しいバージョンには、「マルチ」として選択できるmethodパラメーターが含まれています。 これにより、コードの実行がはるかに高速になります。

chunksizeパラメータを設定するだけで、 to_sqlバッチ挿入するのに十分だと思いますが、違います。

MS SQLユーザーの代替手段は、 turbodbc.Cursor.insertmanycolumnsも使用することです。リンクされたStackOverflowの投稿で説明しました: https

これに関する将来の読者のために、to_sqlに「batch_mode」を使用する2つのオプションがあります。 2つの組み合わせは次のとおりです。

create_engine(connection_string, executemany_mode='batch', executemany_batch_page_size=x)

または

create_engine(connection_string, executemany_mode='values', executemany_values_page_size=x)

これらの引数の詳細については、 https ://docs.sqlalchemy.org/en/13/dialects/postgresql.html#psycopg2-fast-execution-helpersを

postgresユーザーの場合、 methodを呼び出し可能に設定することをお勧めします。

署名付きで呼び出し可能(pd_table、conn、keys、data_iter):これを使用して、特定のバックエンド方言機能に基づいて、よりパフォーマンスの高い挿入方法を実装できます。

https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#insertion-methodのサンプルコードから関数を呼び出します

COPY FROMと、実際にはるかに高速になります🚀

このページは役に立ちましたか?
0 / 5 - 0 評価