2017-06-28 3 views
0

で "executemany"を使用すると、MySQLサーバーがなくなりました。この関数はエラーなく実行されました。Pythonコード

def insertRows(self, query,data): 
     self.cursor.executemany(query,data) 
     self.connection.commit() 

しかし、私は同じデータのための別のコンピュータ上で自分のコードを実行すると、私は次のエラーを得ました。

MySQL Error [2006]: MySQL server has gone away 
Traceback (most recent call last): 
    File "main.py", line 157, in <module> 
    writePostingLists(lst) 
    File "main.py", line 32, in writePostingLists 
    mydb.insertKNNIndex(postingLists,tabelName) 
    File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 78, in insertKNNIndex 
    self.insertRows(query,inputList) 
    File "/home/pythonCode/Doc2Vec_Annoy/KNN/MySQLRepository.py", line 31, in insertRows 
    self.connection.rollback() 
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away') 

私はこの問題は、私がexecutemany機能に与えるリストの長さであることが分かりました。データの長さが300未満

どのように私はこの問題を解決することができたとき

上記のコードは問題なく実行されますか? MySQlの設定に関連していますか?

答えて

1

ここでは、リストを100個ほどの行に分割するオプションがあります。たとえば:

def insertRows(self, query,data, LIST_LENGTH=100): 
    START_INDEX = 0 
    while data[START_INDEX:START_INDEX+LIST_LENGTH]: 
     self.cursor.executemany(query,data[START_INDEX:START_INDEX+LIST_LENGTH]) 
     START_INDEX += LIST_LENGTH 
    self.connection.commit() 

私は、MySQL(やMySQL-Pythonは)おそらく、あなたがそれに渡すことができるデータ量の最大文字長を持っているとします。 (https://piwik.org/faq/troubleshooting/faq_183/から)あなたのエラーについて

mysqldが大きすぎるか、または間違っているパケットを取得した場合、それが何かは、クライアントと間違っていることを前提として接続を閉じます。修正するには、最大パケットサイズ制限max_allowed_packetmy.cnfファイルに増やすことができます。 set max_allowed_packet = 128Mを入力し、MySQLサーバを再起動してください。sudo /etc/init.d/mysql restart

+0

私はコンピュータでこのエラーが発生する理由を探しています。私が探している解決策ではありません。 – Fatima

+0

@ファティマは更新された答えを参照してください。 – David542