次の問題があります。
私は MySQLdb と SSDictCursor で Python を使用して、かなり大きなデータベース (250M 行) を反復処理しています。すべてを RAM にロードできないため、ストリーミング API を使用しています。MySQL サーバーでは、max_allowed_packet サイズはすでに 512M に設定されています。
別のコンピューター (サーバー マシン自体からも) からスクリプトを実行しましたが、ランダムな数の行が処理された後、次のエラーでランダムにクラッシュし続けます。
_mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query')
Exception _mysql_exceptions.OperationalError: (2013, 'Lost connection to MySQL server during query') in <bound method SSDictCursor.__del__ of <MySQLdb.cursors.SSDictCursor object at 0x7fa360e1a690>> ignored
私はスレッドや派手なものを使用していません。なぜこれが起こるのか、私は完全に途方に暮れています。それ以外の方法でこれを解決する方法を知っている人はいますか?
編集:あなたのためのいくつかのサンプルコード。
mysql = MySQLdb.connect("host", "user", "pass", "db")
cursor = mysql.cursor(MySQLdb.cursors.SSDictCursor)
cursor.execute("select stuff from database order by date asc")
for row in cursor:
# just repacking all the information in the cursor row into some dict
cursor.close()
うまくいけば、そのコードが役に立ちました。for ループでは、ローカルの defaultdict でいくつかのルックアップを行っているだけです。
約 80M エントリ (または 40M など) のどこかで、上記のエラーが原因でプログラムが停止します。データは順番に転送する必要があります。また、処理された行の数がランダムであるため、データベース内の行に問題があるためではないと確信しています。私が確認した限り、サーバー自体ではサーバーインスタンスのみが実行されており、他のプログラムはありません。