4

Windows で Python を使用して MS SQL 2005 データベースにデータを入力しようとしています。何百万もの行を挿入していますが、700 万行までにほぼ 1 ギガバイトのメモリを使用しています。以下のテストでは、挿入された 100k 行ごとに 4 MB の RAM を消費します。

import pyodbc
connection=pyodbc.connect('DRIVER={SQL Server};SERVER=x;DATABASE=x;UID=x;PWD=x')
cursor=connection.cursor()
connection.autocommit=True
while 1:
    cursor.execute("insert into x (a,b,c,d, e,f) VALUES (?,?,?,?,?,?)",1,2,3,4,5,6)
mdbconn.close()

ハックソリューション: multiprocessing モジュールを使用して新しいプロセスを生成し、メモリを返しました。この方法で行を挿入すると大量のメモリが消費される理由について、まだ混乱しています。何か案は?

4

5 に答える 5

9

私は同じ問題を抱えていましたが、パラメータ化された挿入に関する pyodbc の問題のようです: http://code.google.com/p/pyodbc/issues/detail?id=145

VALUES 句が設定された静的挿入に一時的に切り替えると、現在のソースからビルドを試みるまで、リークがなくなります。

于 2011-06-18T01:50:06.360 に答える
1

私も同じ問題に直面していました。

それぞれ約 300 MB の 50 以上の XML ファイルを読み取り、それらを SQL Server 2005 にロードする必要がありました。

私は次のことを試しました:

逆参照による同じカーソルの使用。

接続を閉じる/開く

接続をなしに設定します。

最後に、Process モジュールを使用して各 XML ファイルの読み込みをブートストラップしました。

これで、IronPython - System.Data.SqlClient を使用してプロセスを置き換えました。

これにより、パフォーマンスが向上し、インターフェイスも向上します。

于 2011-05-31T09:37:39.740 に答える
0

挿入ごとに個別のカーソルを作成してみてください。ループを通過するたびにカーソル変数を再利用して、前のカーソルを暗黙的に逆参照します。各挿入の後にconnection.commitを追加します。

ガベージコレクターを実行できるようにするには、各ループの下部にあるtime.sleep(0)のような単純なものだけが必要な場合があります。

于 2010-11-04T14:17:20.160 に答える
0

たぶん、100万行ごとに接続を閉じて再度開くのでしょうか?

確かに何も解決しませんが、これを一度行うだけでよい場合は、人生を続けることができます!

于 2010-11-03T15:58:23.600 に答える
0

モジュールgc.collect()をインポートした後、時々ガベージ コレクションを強制することもできます。gc

別のオプションは、使用cursor.executemany()して問題が解決するかどうかを確認することです。ただし、の厄介な点executemany()は、イテレータではなくシーケンスを取ることです (したがって、ジェネレータに渡すことはできません)。最初にガベージコレクターを試してみます。

編集:あなたが投稿したコードをテストしたところ、同じ問題は見られません。古いバージョンの pyodbc を使用していますか?

于 2010-11-17T19:05:13.203 に答える