ImageMagick 转换内存不足
ImageMagick convert out of memory
我有一个自定义应用程序在 CentOS 6.7 上运行,内存为 64 GB,它基本上是一个文件爬虫程序,每次找到与某些文件扩展名(主要是 TIFF 或多页 TIFF)。
我不能确切地说出被考虑的频率和多少文件,但它是数千个的数量级。
#!/bin/bash
IMAGE_INPUT=
OUTPUT=
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 和 convert imagemagick 进程正在占用所有可用内存,并且它们开始消耗所有可用交换空间 space。
如果我不终止这些进程,系统就会耗尽内存并死机。
我该如何解决这种情况?
有没有办法限制特定程序的内存量(转换)或者是否有可能对脚本调用的执行进行排队?
N.B。我已经看到转换命令有限制选项,但如果我理解正确,它适用于 运行 进程的单个实例,而我想 limit 整个 运行 个实例的内存使用情况。
谢谢
您可以尝试使用 GNU Parallel 来限制内存使用并通过 运行 并行作业提高速度。基本上,在指定的可用内存量之前,它不会启动另一个并行作业。
因此,假设您的脚本名为 OCR
并且它采用输入文件名作为参数:
parallel --memfree 1G OCR {} ::: *.tif
我已经使用以下命令解决了这个问题:
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 的回答,它对我的目的有用且合适。
我有一个自定义应用程序在 CentOS 6.7 上运行,内存为 64 GB,它基本上是一个文件爬虫程序,每次找到与某些文件扩展名(主要是 TIFF 或多页 TIFF)。 我不能确切地说出被考虑的频率和多少文件,但它是数千个的数量级。
#!/bin/bash
IMAGE_INPUT=
OUTPUT=
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 和 convert imagemagick 进程正在占用所有可用内存,并且它们开始消耗所有可用交换空间 space。 如果我不终止这些进程,系统就会耗尽内存并死机。
我该如何解决这种情况? 有没有办法限制特定程序的内存量(转换)或者是否有可能对脚本调用的执行进行排队?
N.B。我已经看到转换命令有限制选项,但如果我理解正确,它适用于 运行 进程的单个实例,而我想 limit 整个 运行 个实例的内存使用情况。
谢谢
您可以尝试使用 GNU Parallel 来限制内存使用并通过 运行 并行作业提高速度。基本上,在指定的可用内存量之前,它不会启动另一个并行作业。
因此,假设您的脚本名为 OCR
并且它采用输入文件名作为参数:
parallel --memfree 1G OCR {} ::: *.tif
我已经使用以下命令解决了这个问题:
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 的回答,它对我的目的有用且合适。