---------- -------- 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
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" –
Je voudrais toujours avoir une réponse à cette question, alors j'ai décidé d'ajouter une prime . Hey ça vaut le coup. –
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