Estoy usando convert
para crear un archivo PDF de aproximadamente 2,000 imágenes:
convert 0001.miff 0002.miff ... 2000.miff -compress jpeg -quality 80 out.pdf
El proceso finaliza de forma reproducible cuando el archivo de salida ha alcanzado 2 ^ 31-1 bytes (2 GB −1) con el mensaje
convert: unknown `out.pdf'.
La especificación del archivo PDF permite ≈10 GB . Traté de obtener más información -debug all
, pero no vi nada útil en la salida del registro. El sistema de archivos es ext3 que permite archivos de al menos hasta 16 GiB (puede ser más) . En cuanto a ulimit
, file size
es unlimited
. /etc/security/limits.conf
solo contiene líneas comentadas. ¿Qué más puede causar esto y cómo puedo aumentar el límite?
Versión de ImageMagick: 6.4.3 2016-08-05 Q16
Distribución de OpenMP : SLES 11.4 (i586)
linux
imagemagick
limit
Matthias Ronge
fuente
fuente
Respuestas:
Su limitación no se deriva del sistema de archivos; o de las versiones del paquete , creo .
Su límite de 2 GB proviene de usted usando una versión de 32 bits de su sistema operativo.
La opción para aumentar el archivo sería instalar una versión de 64 bits si el hardware lo admite .
Ver soporte para archivos grandes
fuente
off_t
no ayudará si el software intenta crear todo el archivo en RAM y escribirlo en el disco de una vez.ptrdiff_t
) sí, lo que significa que los tamaños deben estar limitados al valor máximo (firmado) queptrdiff_t
puede representar, o de lo contrario obtendrá errores UB y UB realmente desagradables que las aplicaciones no tienen buena forma de evitarlo.Intente limitar la caché de píxeles utilizada por,
convert
por ejemplo, 1 GiB:Con suerte, esto obligará a ImageMagic a volcar regularmente los datos ya procesados en el disco en lugar de tratar de ajustar más de 2 GiB en los búferes de RAM.
Por cierto, la cantidad de memoria virtual disponible para un solo proceso en Linux de 32 bits está definida por la
VMSPLIT
configuración de configuración del kernel. Puede ser 2G / 2G (2GB para kernel + 2GB para userland) o 1G / 3G (1 GB para kernel + 3 GB para userland). En un sistema en ejecución, la configuración se puede encontrar a través deEn algunos sistemas, la configuración del kernel se almacena en su
/boot/config-$(uname -r)
lugar.fuente
Si no fuera por la gran cantidad de fotografías, podría usar TeX / LaTeX para crear el PDF. Entonces aún puede obtener el mismo resultado (pdf de imágenes) sin el problema del bloqueo del convertidor. Los límites de archivos en TeX deberían ser solo su sistema (hardware + SO)
Pero creo que podría usar un script de shell para escribir el TeX:
0)
1) hacer una plantilla
1.1) Estoy seguro de que hay una manera de hacer este paso de una vez, reemplazando el nombre de la imagen con variable e insertando en lugar de agregar, y formatear $ FOO para que tenga los primeros 0 correctos, pero lo siguiente es justo lo que sé .
1.2) La plantilla debe dividirse para que el script inserte el nombre del archivo
1.3) nano tmplt1 / * o editor de su elección * /
1.3.1) Sin embargo, sus archivos van 0001.miff ... 0010.miff ... 0100.miff ... 2000.miff. Es decir, un número variable de ceros a la izquierda. Solución alternativa: 4 versiones de tmplt1: tmplt1-9, tmplt10-99, tmplt100-999, tmplt1000-2000. Tmplt1-9 termina “... ancho] {000” (es decir, agregue 3 0's); tmplt10-99 termina "... ancho] {00" (es decir, agregue 2 0). 100-999 agrega 1 cero y 1000-2000 es lo mismo que tmplt1
1.4) siguiente parte de la plantilla: nano tmplt2 / * OEOYC * /
1.5) siguiente parte de la plantilla: nano tmplt3 / * OEOYC * /
1.6) siguiente plantilla: nano tmplt4 / * OEOYC * /
2) hacer el comienzo del archivo: nano head / * OEOYC * /
3) hacer el final del archivo: nano pie / * OEOYC * /
4) crea el script: nano loader / * OEOYC * /
5) hacer que el script sea ejecutable: chmod u + x loader
5.1) Después de probar esto, descubrí que cada vez que se insertaba $ FOO, se extendía en 3 líneas. No conozco otra solución que no sea entrar en el script y eliminar manualmente los retornos de carro. Al menos solo 36 para todas las fotos de 2000
6) script de llamada: cargador
7) compile el TeX: pdflatex out.pdf
fuente