2010-11-17 70 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