使用命名管道时出现“打开文件过多”错误

时间:2019-02-09 17:24:25

标签: ruby named-pipes file-descriptor rmagick

我正在运行2个脚本,过了一会儿,我得到Too many open files @ error/blob.c/ImageToFile/1832

第一个脚本的简化版本。应该读取写入im​​age_pipe的图像,进行处理,然后将其写入ocr_pipe以便OCR读取。

# creates 2 named pipes
File.mkfifo(image_pipe) rescue nil
File.mkfifo(ocr_pipe) rescue nil

while image = Image.read(image_pipe)
  # do some stuff with `image`...
end

第二个脚本使用ffmpeg从视频中提取帧,并将其写入image_pipe

# image_pipe is the same as the script above.

(14..movie.duration).step(0.5) do
  `/usr/local/bin/ffmpeg [some options...] #{image_pipe}`
end

我认为问题在于RMagick在第一个脚本的循环中读取图像时打开了太多的文件描述符,但是我不确定如何阻止这种情况的发生。 Magick::Image类没有close方法或其他任何东西,afaik。

1 个答案:

答案 0 :(得分:1)

我没有找到问题的根本原因,但是ulferts帮助我找到了我可以接受的解决方法。

代替让RMagick自己打开文件,我们应该自己处理它,然后使用.from_blob创建Magick::Image实例。

while f = File.read(image_pipe)
  image = Image.from_blob(f)
  # ... do stuff with image.
end