Python MySQL schreibt Longblob

Python MySQL schreibt Longblob

Hallo, ich verwende Python Connector 8.0.13 unter Python 3.6 und MySQL 5.5.62. Unter Win 7

Ich möchte große Blob-Daten in meine Tabellen schreiben. Das Problem ist, dass die Abfrage unter Python den Server mit dem folgenden Fehler zum Absturz bringt:

C:\Programme (x86)\MySQL\MySQL Server 5.5\bin\mysqld.exe: Nicht genügend Arbeitsspeicher (240225944 Bytes erforderlich)

Und

Fehler: Nicht genügend Arbeitsspeicher; überprüfen Sie, ob mysqld oder ein anderer Prozess den gesamten verfügbaren Arbeitsspeicher verwendet. Wenn nicht, müssen Sie möglicherweise „ulimit“ verwenden, um mysqld die Verwendung von mehr Arbeitsspeicher zu ermöglichen, oder Sie können mehr Swap-Speicher hinzufügen.

Mein RAM und mein Swap sind voll, wenn dies geschieht. Das Seltsame ist. Wenn ich MySQL Workbench verwende, werden die Daten eingefügt.

Was ich bis jetzt getan habe:

  • Erhöhung innodb_buffer_pool_sizeauf 256 Mio.
  • Max_allowed_packetbis 2G
  • Setzen Sie alle Timeout-Einstellungen auf mindestens 600 (auch in mysql.connector.connect).

Das Einfügen über Python sieht ungefähr so ​​aus:

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])

Der obige Code funktioniert für Daten von etwa 15 bis 20 MB einwandfrei, aber bei beispielsweise 200 MB (wie im obigen Fehler) stürzt der Server ab.

Ich wäre dankbar, wenn jemand von Euch eine Idee hätte, wie sich das Problem lösen ließe.

Antwort1

OK, nach einigem Herumprobieren habe ich eine funktionierende Lösung gefunden.

Das Stichwort lautet:LOAD_FILE()

Mit dieser Funktion können Daten aus jedem Dateityp geladen werden. Die hochzuladende Datei muss jedoch auf dem Host-Server vorhanden sein. (Beachten Sie secure_file_priv.)

Die Syntax sieht ungefähr so ​​aus:

INSERT INTO table (Blobcolumn) VALUES(load_file('full path' ))

Achtung, zumindest unter Windows müssen die Schrägstriche vorwärts (/) sein. Auch load_file() scheint keinen Fehler auszulösen, wenn die Datei nicht eingefügt wurde.

Ich habe bisher problemlos mit einer 400 MB großen Datei getestet. Außerdem ist es kein Problem, die Daten auf die übliche Weise auszuwählen und abzurufen.

Das fühlt sich eher wie ein Workaround an. Ich bin immer noch offen für bessere Lösungen. Ich würde auch gerne wissen, ob es sich um einen Fehler handelt, der nur in 5.5 vorhanden war, oder ob dieses Problem auch in aktuellen Versionen noch besteht.

verwandte Informationen