2010-11-17 52 views
3

J'ai un grand nombre de produits que je veux afficher en pdf, avec en-tête de catégorie. Si une catégorie ne tient pas sur la page actuelle, je veux la déplacer à la suivante. Pour cela, j'utilise la méthode de groupe de Prawn.Ruby: Prawn PDF à court de mémoire lors de l'utilisation de la méthode de groupe

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 

Cela fonctionne très bien pour les petites quantités de produits, mais quand j'ajoute plus de 100 ou donc il faut un temps très long et se termine alors en « pas allouer de la mémoire ». Si je n'utilise pas la méthode de groupe, cela prend environ 30 secondes.

Clairement, la méthode de groupe ne gère pas très bien son utilisation de la mémoire. Toutes les suggestions pour les solutions de contournement seraient appréciées.

+0

Après un peu plus de recherche à travers SO, j'ai pensé que j'ai trouvé une solution de contournement qui comblerait mes besoins: http://stackoverflow.com/questions/2081635. Malheureusement, l'utilisation de cette méthode a exactement le même problème: après un certain temps, le processus commence à prendre 100% CPU et finit par "ne pas allouer la mémoire" –

+0

Je voudrais toujours avoir une réponse à cette question, alors j'ai décidé d'ajouter une prime . Hey ça vaut le coup. –

+0

J'ai le même problème avec Prawn et la méthode de groupe. Il semble que le groupe fonctionne correctement jusqu'à environ le 50ème groupe dans un fichier PDF. À ce stade, il faut beaucoup de temps pour parcourir les groupes suivants. – Teddy

Répondre

1

---------- -------- RÉPONSE À JOUR

La solution précédente n'a pas été assez bon pour le serveur de production, donc je devais utiliser la version de développement de git repo installé en tant que sous-module sous fournisseur/crevette, comme décrit ici:

Le problème de mémoire avec la méthode de groupe a disparu, mais la syntaxe/les options pour les choses ont quelque peu changé. J'ai donc dû réécrire le code pour générer du PDF.

De plus, il est difficile de faire en sorte que le sous-module fonctionne correctement avec le repo git pour l'application Rails. Le déploiement à la production était difficile.

---------- -------- RÉPONSE ORIGINAL

Ce n'est pas une solution, mais il fait le problème prendre quelques itérations du groupe avant qu'elle ne se manifeste :

  • override la méthode de l'instance de document Prawn nommé 'groupe'
  • utiliser le code de la fonction 'groupe' de la plus récente version de développement de gambas (de github.com)

La façon dont je Est-ce que c'est que j'ai ajouté un fichier dans le dossier/lib de mon application Rails. Ce fichier comprendra les pierres précieuses Prawn et défini le type MIME pour un document PDF:

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 

Et puis dans un fichier modèle, je définir une méthode pour générer mon PDF et utiliser quelque chose comme ceci:

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

Hey désolé pour la réponse tardive. Merci de me rappeler de cela, j'ai mis à jour à la crevette 0.11.1 et il semble que vous avez raison, les problèmes de mémoire ont disparu. J'ai choisi de réécrire à partir de la base pour s'adapter à la nouvelle syntaxe et ça fonctionne magnifiquement maintenant. Merci encore! –

2

J'utilisais crevette sur un projet, désolé de le dire, mais c'était un désastre, enfin nous avons dû passer à wicked pdf. Je vous conseille de faire de même avant de ne pas avoir trop de code.

+0

Merci pour la suggestion, je commence à penser la même chose. Malheureusement, j'ai besoin d'un formatage très précis basé sur une conception existante uniquement imprimable. Wicked pdf je pense utilise la conversion html. Je suis à la recherche d'autres options comme pdf-écrivain si. –

+0

Je suppose qu'aucune meilleure réponse ne sera donnée. J'ai décidé de passer en pdf-writer, même si c'est lent. C'est vraiment dommage que Prawn ne gère pas bien ce genre de choses parce que c'est la bibliothèque PDF de loin la plus pratique que j'ai trouvée. –