Ошибка «Слишком много открытых файлов» при использовании именованных каналов - PullRequest
0 голосов
/ 09 февраля 2019

Я запускаю 2 скрипта и через некоторое время получаю Too many open files @ error/blob.c/ImageToFile/1832.

Упрощенная версия первых скриптов.Он должен читать изображения, записанные в image_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 или чего-либо еще, афаик.

1 Ответ

0 голосов
/ 10 февраля 2019

Я не нашел основную причину проблемы, но ulferts помог мне найти приемлемый для меня обходной путь.

Вместо того, чтобы позволить RMagick открыть сам файл, мы должны обработатьна нашей стороне, а затем используйте .from_blob для создания экземпляра Magick::Image.

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