性能问题通过Paperclip上传大文本文件

时间:2014-01-27 19:06:35

标签: ruby-on-rails ruby imagemagick paperclip

我正在从Ruby 1.8.7升级到1.9.3并从Rails 2.3升级到3.2作为升级的一部分,我将从Paperclip 2.2.9升级到3.5.2。我的ImageMagick版本是6.8.6。我在升级过程中发现的一个问题是,对于大型(~1 MB)文本文件,上传性能非常差。有问题的文件不需要特别是.txt文件,任何纯文本格式的文件(例如.xml文件)也会受到影响。

供您参考,这是我的Paperclip设置:

  has_attached_file :attachment,
    :url => "/shared_documents/:id/:basename.:extension",
    :path => ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

为简单起见,我省略了我们的验证等等,因为我们只是检查文件大小和存在。

看着我的开发机器上运行的顶级进程,当Paperclip调用ImageMagick的identify命令时,似乎出现了瓶颈。通过命令行对各种文件调用identify使我能够验证图像文件几乎立即返回元数据,但是大型非图像文本文件需要很长时间才能处理。

对于我的应用程序,我允许用户以他们喜欢的任何格式上传文档,因此我必须能够有效地处理图像和文本文件。还有其他人遇到过这个问题吗?有没有办法选择性地禁止在Paperclip中的某些文件格式上调用identify而不是其他文件格式?如果失败了,如果这是一个选项,我们可以直接不调用identify。也许有一种方法可以将ImageMagick配置为更优雅地处理大文本文件吗?

1 个答案:

答案 0 :(得分:2)

如果您实际上没有对文件进行处理,请告诉Paperclip不要对其进行处理。从Paperclip文档中,您可以通过几种方式完成此操作。一种是在模型中提供一个空的样式列表:

has_attached_file :attachment, 
  styles:{}, 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

或者,您可能只提供没有处理器

has_attached_file :attachment, 
  processors:[], 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

或者,您可以在模型中使用before_post_process回调并返回false以暂停该过程,但Paperclip可能首先调用identify来验证该文件,这会使此选项对您的情况毫无意义:

has_attached_file :attachment, 
  url: "/shared_documents/:id/:basename.:extension",
  path: ":rails_root/user_uploaded_content/shared_documents/:id/:basename.:extension"

before_post_process :skip_processing

def skip_processing
  false
end