ImageMagick转换内存不足

时间:2018-01-24 12:58:37

标签: linux imagemagick out-of-memory

我有一个自定义应用程序在CentOS 6.7上运行,内存为64 GB,基本上是一个文件爬虫,每次找到匹配某些文件扩展名(主要是TIFF或多页TIFF)的文件时都会调用以下bash脚本。 我无法确切地说出频率和被考虑的文件数量,但它大约有数千个。

#!/bin/bash

IMAGE_INPUT=$1
OUTPUT=$2
TMP_FOLDER=/data/tesseract-tmp

# generating a unique random file name
TFN=`cat /dev/urandom | tr -cd 'a-f0-9' | head -c 32`;
# converting the image and putting the result into the TFN
/usr/bin/convert -density 288 "$IMAGE_INPUT" -resize 75% -quality 100 -append jpeg:$TMP_FOLDER/$TFN;
# extract text with tesseract and put it into a result file
/usr/local/bin/tesseract $TMP_FOLDER/$TFN $TMP_FOLDER/$TFN.out;
cp $TMP_FOLDER/$TFN.out.txt $OUTPUT;
# returning the file content to std output
cat $OUTPUT;

cronjob正在清理临时文件。

我注意到经过一段时间和大量调用脚本后,top命令显示我的图像标记的 gs 转换进程正在占用所有内存可用,它们开始消耗所有可用的交换空间。 如果我不杀死这些进程,系统会耗尽内存并冻结。

我该如何解决这种情况? 有没有办法限制特定程序(转换)的内存量,还是有可能将执行调用队列排队到脚本?

N.B。我已经看到转换命令有限制选项,但如果我理解正确,它适用于正在运行的进程的单个实例,而我想限制内存使用情况整个运行实例。

由于

2 个答案:

答案 0 :(得分:2)

您可以尝试使用 GNU Parallel 来限制内存使用并通过并行运行作业来提高速度。基本上,在指定的内存量空闲之前,它不会启动另一个并行作业。

因此,假设您的脚本被调用OCR并且它将输入文件名作为参数:

parallel --memfree 1G OCR {} ::: *.tif

答案 1 :(得分:1)

我已使用以下命令解决了这个问题:

nice -20 /usr/bin/convert -limit memory 32 -limit map 32 -density 288 "$IMAGE_INPUT" -resize 75% -quality 100 -append jpeg:$TMP_FOLDER/$TFN;

这样,内存完全被占用,但它永远不会开始交换,系统永远不会冻结。

非常感谢Mark Setchell的回答,这对我的目的很有用和适合。