df_name.to_sql('table_name',
schema = 'public',
con = engine,
index = False,
if_exists = 'replace')
500,000行のデータフレームをpostgresAWSデータベースに書き込んでいますが、データをプッシュするのに非常に長い時間がかかります。
それはかなり大きなSQLサーバーであり、私のインターネット接続は優れているので、問題の原因であるとしてそれらを除外しました。
比較すると、csv2sqlまたはcatを使用して、コマンドラインでpsqlにパイプする方がはるかに高速です。
ここを参照してください: 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ファイルを削除するだけです)圧縮ファイルに新しいバージョンが書き込まれることを確認するため)
ちょっと@ 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
と、実際にはるかに高速になります🚀
最も参考になるコメント
このコードを
engine = create_engine(connection_string)
下に追加します:私のコードでは、
to_sql
関数の実行に7分かかっていましたが、今では5秒しかかかりません;)