0 votes

Exception System.OutofMemory dans une application ASP.net

J'ai une application web ASP.net 3.5 développée en VB.net. J'utilise le composant iTextsharp pour générer un document PDF à partir de la page ASP.net.

Je traite les documents PDF stockés dans la base de données et je les fusionne en un seul PDF en utilisant le memorystream.

Mais lorsque j'essaie de fusionner environ 1000 pdfs contenant chacun 2 pages, je reçois une exception Outofmemory.

Avez-vous des suggestions et pensez-vous que cette approche est correcte ?

Veuillez m'aider

1voto

Brett Allen Points 1989

Je crois que la bonne approche consiste à repenser la manière dont vous atteignez votre objectif.

Pourquoi demandez-vous à une page web de compiler 1000 PDF en un seul ?

Cette tâche ne peut-elle pas être configurée pour créer la "dernière version" de cet énorme PDF, qui est exécutée une fois par jour, et la page que vous avez sert simplement la dernière version ?

Et oui, cela fonctionnerait lentement même sur 64 bits avec 4 gigas de RAM, parce que ce n'est pas le travail d'une requête web, c'est le travail d'un type de service planifié.

Mise à jour : En réponse à votre commentaire, vous pourriez peut-être créer une page de chargement temporaire indiquant que votre fichier est en train d'être généré, et pousser le travail dans un fil d'arrière-plan. Lorsque le fil de discussion est terminé, la page de chargement lance le téléchargement du document complet. À moins que vous ne puissiez faire ce que je suggère dans mon commentaire, je doute que vous puissiez accélérer les choses beaucoup plus. La seule chose que vous pouvez faire est de rendre l'attente plus conviviale.

Peut-être même utiliser un peu d'AJAX et leur donner une barre d'état avec "Fusionner la page 106 sur 1000". Ils verront le progrès et seront moins frustrés.

Une machine plus puissante serait le seul moyen d'aider, et le 64 bits est nécessaire pour éviter le manque de mémoire.

1voto

bendewey Points 25437

Malgré le fait que ce sera vraiment lent (Recherche Async ASP.NET Pages), pourquoi ne pas simplement fusionner les fichiers dans le système de fichiers plutôt que dans un MemoryStream ?

Ensuite, lorsque vous avez terminé, vous pouvez utiliser Response.TransmitFile(string filename)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X