On Jueves 22 Septiembre 2011 21:24:01 Alvaro Herrera escribió: > Excerpts from sebastian's message of jue sep 22 16:54:54 -0300 2011: > > Estimados. > > > > Espero que tenga un buen día, les escribo porque tengo un problema > > extraño, estoy insertando en una tabla de 5 columnas (bigint, > > timestamp, varchar, varchar, xml) una fila cuyo campo xml pesa entre > > 800MiB a 1.2GiB, sin embargo el INSERT de una única fila, se cae por > > memoria (he probado en un equipo con 4GiB de RAM, otro con 6GiB y un > > servidor con 8GiB, en todo se cae por memoria). > > > > Mirando el log me arroja lo que adjunto. El ulimit del sistema está en > > unlimited. > > Falta un mensaje de error en alguna parte, pero el dump de memoria > (repetido tres veces: cada vez empieza con la línea que dice > TopMemoryContext) indica claramente que el servidor se queda sin > memoria. > > La verdad es que no me sorprende mucho. Al recibir un dato grande, lo > primero que hará el servidor será tratar de comprimirlo, y para esto > obviamente tiene que hacer un malloc de un área de memoria al menos tan > grande como el dato que está recibiendo. Es posible que realice una > segunda copia por alguna razón, con lo cual necesitarías el triple de > memoria ... y ahí la cosa se empieza a poner complicada. > > Para evitar el consumo de memoria causado por el intento de compresión, > podrías cambiar el modo de almacenamiento. Mira la documentación en > ALTER TABLE / SET STORAGE. Además puede ser conveniente usar un > parámetro para mandar el valor XML gigante en lugar de interpolarlo > dentro de la consulta. Y por último, quizás puedas usar el modo > "fastpath" para invocar a una función, pero no tengo claro si puedes > pasar los parámetros como parámetros separados ... Pero vale la pena > intentarlo.
Lo que adjunté en el correo es todo el log que me entrega el servidor, cambiando a log all, me devuelve la consulta, pero no aporta información adicional, no encontré tampoco una forma de hacer que me mostrara mensajes más detallados. Lo que me sorprende es que no intente usar swap, y aún el tema de la copia, también me llama la atención, ya que para que los 800MiB, colpasen la máquina, se debería copiar más de 4 veces, lo que me sorprende. De todos modos, la idea que propones Álvaro, me parece bastante pausible, lo intentaré mañana en el trabajo. Muchas Gracias. Saludos cordiales. - Enviado a la lista de correo pgsql-es-ayuda ([email protected]) Para cambiar tu suscripci�n: http://www.postgresql.org/mailpref/pgsql-es-ayuda
