
こんにちは。私はPython 3.6とMySQL 5.5.62でPythonコネクタ8.0.13を使用しています。Win 7で
大きな BLOB データをテーブルに書き込みたいのですが、問題は Python ではクエリがエラーでサーバーをクラッシュさせることです。
C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin\mysqld.exe: メモリ不足です (必要なバイト数は 240225944 バイト)
そして
エラー: メモリ不足。mysqld または他のプロセスが使用可能なメモリをすべて使用していないかどうかを確認してください。使用していない場合は、mysqld がより多くのメモリを使用できるように 'ulimit' を使用するか、スワップ領域を追加する必要があります。
これが発生すると、RAM もスワップもいっぱいになりません。奇妙なことに、MySQL Workbench を使用すると、データが挿入されます。
ここまでに私がやったこと:
innodb_buffer_pool_size
256Mに引き上げMax_allowed_packet
2Gまで- すべてのタイムアウト設定を少なくとも 600 に設定します (mysql.connector.connect でも)
Python 経由の挿入は次のようになります。
command = 'INSERT into table (col1,Blob, col3,... ) Values(val1, %s, val3) on duplicate key update col1=val1, Blob = %s, col3=val3'
cursor.execute(command, [Blobdata, Blobdata])
上記のコードは、約 15 ~ 20 MB のデータに対しては問題なく動作しますが、たとえば 200 MB の場合 (上記のエラーのように)、サーバーがシャットダウンします。
これを解決する方法をご存知の方がいらっしゃいましたら、幸いです。
答え1
OK、少し時間をかけた後、実用的な解決策を見つけました。
キーワードは次のとおりです。LOAD_FILE()
この機能は、あらゆる種類のファイルタイプからデータを読み込むことができます。ただし、アップロードするファイルはホスト サーバー上に存在している必要があります (secure_file_priv に注意してください)。
構文は次のようになります。
INSERT INTO table (Blobcolumn) VALUES(load_file('full path' ))
注意してください。少なくとも Windows では、スラッシュは前向き (/) にする必要があります。また、ファイルが挿入されていない場合、load_file() はエラーを発生させないようです。
これまで 400 MB のファイルで問題なくテストしました。また、通常の方法でデータを選択して取得しても問題はありません。
これは回避策のように思えます。もっと良い解決策をまだ探しています。また、これが 5.5 にのみ存在したバグなのか、それとも最新バージョンでもこの問題がまだ存在するのかを知りたいです。