Python MySQL escribiendo longblob

Python MySQL escribiendo longblob

Hola, estoy usando el conector Python 8.0.13 en Python 3.6 y MySQL 5.5.62. En ganar 7

Quiero escribir datos de blobs grandes en mis tablas. El problema es que en Python la consulta bloquea el servidor con el error:

C:\Program Files (x86)\MySQL\MySQL Server 5.5\bin\mysqld.exe: Sin memoria (se necesitan 240225944 bytes)

Y

Error: Sin memoria; comprobar si mysqld o algún otro proceso utiliza toda la memoria disponible; si no, es posible que tengas que usar 'ulimit' para permitir que mysqld use más memoria o puedes agregar más espacio de intercambio

Mi Ram ni Swap están llenos cuando esto ocurre. Lo extraño es. Si uso MySQL Workbench, los datos se insertan.

Lo que hice hasta este punto:

  • Subir innodb_buffer_pool_sizea 256M
  • Max_allowed_packeta 2G
  • Establezca todas las configuraciones de tiempo de espera en al menos 600 (también en mysql.connector.connect)

La inserción a través de Python se ve así:

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

El código anterior funciona para datos de entre 15 y 20 MB sin problemas, pero con, por ejemplo, 200 MB (como en el error anterior) el servidor se apaga.

Estaría agradecido si alguno de ustedes tuviera una idea de cómo resolver esto.

Respuesta1

Bien, después de jugar un poco, encontré una solución que funciona.

La palabra clave es:LOAD_FILE()

Esta función puede cargar datos desde cualquier tipo de archivo. Sin embargo, el archivo a cargar debe estar presente en el servidor host. (tenga en cuenta Secure_file_priv).

La sintaxis se parece a esto:

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

Cuidado, al menos con Windows, las barras deben estar hacia adelante (/). Además, load_file() parece no generar un error si el archivo no se insertó.

Probé hasta ahora con un archivo de 400 MB sin problemas. Además, no hay problema para seleccionar y recuperar los datos de la forma habitual.

Esto se siente más como una solución alternativa. Todavía estoy abierto a mejores soluciones. También me gustaría saber si se trata de un error que sólo estaba presente en 5.5 o si este problema todavía existe en las versiones actualizadas.

información relacionada