2010-11-17 74 views
3

我有大量的产品我想用pdf显示,并带有类别标题。如果一个类别不适合当前页面,我想将它移到下一个。为此,我使用了Prawn的组方法。Ruby:大虾PDF使用组方法时内存不足

Product.all.group_by(&:category).each do |category, products| 
    pdf.group do 
    # Simplified the data a bit for this example 
    pdf.text category 
    pdf.table products.map{ |p| [p.title, p.price] } 
    end 
end 

这非常适用于少量的产品,但是当我加100多左右,它需要很长的时间,然后在“分配内存失败”结束。如果我不使用组方法,则需要大约30秒。

显然,group方法不能很好地管理其内存使用情况。任何建议的解决方法将不胜感激。

+0

经过一番搜索后,我认为我找到了一个解决方案,可以满足我的需求:http://stackoverflow.com/questions/2081635。不幸的是使用这种方法有完全相同的问题:一段时间后,进程开始占用100%的CPU,并最终导致“未能分配内存” – 2010-11-18 19:17:02

+0

我仍然想回答这个问题,所以我决定添加一个赏金。嘿,这值得一试。 – 2010-12-05 20:58:25

+0

我与虾和组方法有同样的问题。 它看起来像小组一样工作,直到大约第50组在PDF中。在那一点上,迭代后续组需要很长时间。 – Teddy 2011-03-24 19:32:56

回答

1

----------修订答案--------

以前的解决方法不是为生产服务器不够好,所以我不得不使用开发版本从混帐repo作为供应商/对象下的子模块安装,如下所述:https://github.com/sandal/prawn/wiki/Using-Prawn-in-Rails

组方法的内存问题消失了,但事情的语法/选项有所改变。所以我不得不重写代码来生成PDF。

此外,获得子模块与混帐回购协议的Rails应用程序发挥很好很困难。部署到生产是艰难的。

----------原来的答案--------

这不是一个解决方法,但它使问题多走几家组迭代它通常表现为前:

  • 倍率的虾::文献实例方法命名为“组”
  • 从“组”功能从虾的最新发展版本(从github.com)使用的代码

我的方式这是否是我添加了一个文件到我的Rails应用程序的/ lib文件夹。该文件将包括虾宝石和定义PDF文档的MIME类型:

class PdfPrawn 
    require 'prawn' 
    require 'prawn/core' 
    require 'prawn/table' 
    MIME_TYPE = "application/pdf" 
end 
class Prawn::Document 
    def group(second_attempt=false) 
    old_bounding_box = @bounding_box 
    @bounding_box = SimpleDelegator.new(@bounding_box) 

    def @bounding_box.move_past_bottom 
     raise RollbackTransaction 
    end 

    success = transaction { yield } 

    @bounding_box = old_bounding_box 

    unless success 
     raise Prawn::Errors::CannotGroup if second_attempt 
     old_bounding_box.move_past_bottom 
     group(second_attempt=true) { yield } 
    end 

    success 
    end 
end 

,然后在模型文件,我定义了一个方法生成的PDF和使用这样的:

def to_pdf 
    require "#{File.expand_path(RAILS_ROOT)}/lib/pdf_prawn" 
    pdf = Prawn::Document.new 
    # code to add stuff to PDF 
    pdf.render 
end 
+0

嘿,对不起,迟交回复。感谢提醒我这一点,我升级到0.11.1大虾,它看起来你是对的,内存问题已经消失。我选择从头开始重新编写,以适应新的语法,现在它的工作很精美。再次感谢! – 2011-04-09 21:51:52

2

我是用虾上一个项目,很遗憾的告诉,但它是一个灾难,最后只好改用wicked pdf。我建议你在不需要太多代码之前也要这样做。

+0

感谢您的建议,我开始思考同样的事情。不幸的是,我需要基于现有的仅打印设计的非常精确的格式。邪恶的pdf我认为使用html转换。我正在研究其他选项,如PDF编写器,但。 – 2010-11-18 15:17:42

+0

我想没有更好的答案会出现。尽管速度很慢,但我决定切换到PDF编写器。这真是一个耻辱虾不处理这个东西,因为语法明智,它是迄今为止我遇到过的最方便的PDF库。 – 2010-11-23 19:02:24