Ruby on rails 使用carrierwave版本时堆栈级别太深
我正在尝试使用,它或多或少地将一个图像文件保存到数据库(使用carrierwave)。要保存的文件很少,这些文件是从视频文件中提取的关键帧。那就是那个工人的工作 My image uploader定义了几个版本,如下所示:Ruby on rails 使用carrierwave版本时堆栈级别太深,ruby-on-rails,ruby,carrierwave,sidekiq,Ruby On Rails,Ruby,Carrierwave,Sidekiq,我正在尝试使用,它或多或少地将一个图像文件保存到数据库(使用carrierwave)。要保存的文件很少,这些文件是从视频文件中提取的关键帧。那就是那个工人的工作 My image uploader定义了几个版本,如下所示: class KeyframeUploader < CarrierWave::Uploader::Base # ... # Keyframe thumbnail sizes version :small do process resize_to_f
class KeyframeUploader < CarrierWave::Uploader::Base
# ...
# Keyframe thumbnail sizes
version :small do
process resize_to_fill: [180, 180], if: :square?
process resize_to_fill: [320, 180], if: :not_square?
end
version :medium do
process resize_to_fill: [460, 460], if: :square?
process resize_to_fill: [640, 460], if: :not_square?
end
version :large do
process resize_to_fill: [720, 720], if: :square?
process resize_to_fill: [1280, 720], if: :not_square?
end
private
# Checks if image is a square
def square? file
img = Magick::Image.read(file.path)
img[0].columns == img[0].rows
end
# Oposite to #square?
def not_square? file
!square? file
end
end
class KeyframeUploader
问题是,当我试图运行我的Sidekiq Worker时,它抛出了赛璐珞::FiberStackError:stack level太深了
,解决这个问题的唯一方法是删除我的版本定义。只有当没有任何版本分配给上传程序时,它才起作用
我曾尝试将保存进程移动到另一个工作进程,或使用Carrierwave::Backgrounder,但我总是得到相同的结果
你知道我能做什么吗
编辑:我的stracktrace是: SystemStackError:堆栈级别距离太深 /usr/local/rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/irb/workspace.rb:86
我会将目标锁定在您的工作程序中的for循环
for i in 1..(frames_to_extract)
你没有增加i,但你似乎在做一个索引循环。我会将其切换为使用enum和带有索引的每个\u
红宝石爱好者倾向于避免使用for循环,因为这是一个令人讨厌的混乱
事实证明,这是carrierwave的错(实际上是osx的错)。带说明的线程: 解决方案:
仅供参考
堆栈级别太深
意味着您在某个地方有一个无限循环是的,我知道。问题是我不知道在哪里可以买到它。我有点觉得这不是我的错,而是carrierwave的错。你能把你的工人也给我们看看吗?你的代码有一个小错误。31秒有6帧,60秒有3帧。60包含在“其他”中。。。不重要,请注意。你能在这里发布堆栈跟踪吗?另外,您使用的是哪一版本的carrierwave/sidekiq?这似乎是问题所在。。。你可能会看到一大堆相同的“从…截图”日志条目,如果这是问题的话。嗯,当我在sidekiq之外上传图像时也是这样。是的,如果我不使用sidekiq进行处理,也会出现错误。Stacktrace添加到原始问题中。您如何触发后处理?通过回调?还有,你看到了吗?可能是后处理库错误,您使用什么来调整图像大小?你能发布Gemfile.lock吗?是的,我见过那个线程,但我一直在使用rmagick,没有任何问题,我希望保持这种方式。Gemfile.lock:。关于触发后处理-我不知道如何回答,我正在以常规方式从carrierwave readme.mbajur触发它们,据我所知,您正在使用的RMagick版本中存在错误,请查看您的代码是否与其他后处理库一起工作,如果可以,尝试使用RMagick版本和/或ruby版本,直到您的代码正常工作为止,或者失败,请等待RMagick的优秀人员解决问题。我已经发布了一个解决方案,并给出了解释作为答案。谢谢你的支持!哇哦。救了我一天!很高兴你找到了答案。即使您得到的错误中有赛璐珞::
,但此问题似乎不是赛璐珞
标记的一部分。你同意吗?是的,完全同意。去除赛璐珞标签。
gem 'rmagick', :require => 'RMagick'