2017-04-05 10 views
1

Dans mon application Web, j'utilise LeadTools pour créer un fichier Tiff multi-pages à partir d'un flux. Voici un code qui montre comment j'utilise leadtools.LeadTools MaximumGlobalRasterImageMemory

using (RasterCodecs codecs = new RasterCodecs()) 
{ 
    RasterImage ImageToAppened = default(RasterImage); 
    RasterImage imageSrc = default(RasterImage); 
    codecs.Options.Load.AllPages = true; 
    ImageToAppened = codecs.Load(fullInputPath, 1); 
    FileInfo fileInfooutputTiff = new FileInfo(fullOutputPath); 
    if (fileInfooutputTiff.Exists) 
    { 
     imageSrc = codecs.Load(fullOutputPath); 
     imageSrc.AddPage(ImageToAppened); 
     codecs.Save(imageSrc, fullOutputPath, RasterImageFormat.Ccitt, 1); 
    } 
    else 
    { 
     codecs.Save(ImageToAppened, fullOutputPath, RasterImageFormat.Ccitt, 1); 
    } 
} 

Ci-dessus le code fonctionne correctement et je reçois de nombreuses demandes pour mon application web à environ 2000 demandes. Dans certains cas, je suis en dessous de l'erreur. Mais plus tard encore, cela fonctionne correctement pour d'autres demandes.

You have exceeded the amount of memory allowed for RasterImage allocations.See RasterDefaults::MemoryThreshold::MaximumGlobalRasterImageMemory. 

Est-ce problème de mémoire est pour seule demande ou pour tous les objets lors de l'application a commencé (objet global)? Alors, quelle est la solution pour l'erreur ci-dessus?

+1

Avez-vous essayé de lire [documentation] (https://www.leadtools.com/help/leadtools/v19m/dh/l/rastermemorythreshold-maximumglobalrasterimagememory.html)? – Evk

Répondre

1

Lors de la manipulation des fichiers avec beaucoup de pages, voici quelques conseils généraux qui pourraient aider à la fois des applications Web et de bureau:

  • Évitez de charger toutes les pages et les ajouter à une RasterImage en mémoire. Au lieu de faire une boucle à travers eux et les charger un (ou quelques) à la fois, puis les ajouter au fichier de sortie sans les garder en mémoire. L'ajout au fichier peut ralentir au fur et à mesure que le nombre de pages augmente, mais this help topic explique comment vous pouvez accélérer ce processus.
  • Vous avez "en utilisant (codecs RasterCodecs ..)" dans votre code, mais la grande mémoire est pour l'image, pas l'objet codecs. Envisagez d'envelopper votre objet RasterImage dans une portée "using" pour accélérer sa mise au rebut. En d'autres termes, optez pour "using (RasterImage image = ...)"
  • Et la suggestion évidente: allez sur 64 bits, installez autant de RAM que possible et augmentez la valeur de MaximumGlobalRasterImageMemory.
3

L'erreur que vous signaler les références les MaximumGlobalRasterImageMemory:

Vous avez dépassé la quantité de mémoire allouée pour RasterImage allocations.See RasterDefaults :: MemoryThreshold :: MaximumGlobalRasterImageMemory.

Dans le documentation il est écrit:

Obtient ou définit une valeur qui spécifie la taille maximale autorisée pour toutes les allocations d'objet RasterImage. Lors de l'allocation d'un nouvel objet RasterImage, si la nouvelle allocation entraîne une augmentation de la mémoire totale utilisée par tous les objets RasterImage alloués pour dépasser la valeur de MaximumGlobalRasterImageMemory, l'allocation lèvera une exception.

Donc, il semble que ce soit pour tous les objets.

Ce sont les valeurs par défaut spécifiées:

Sur les systèmes x86, la valeur par défaut de propriété à 1,5 Go.

Sur les systèmes x64, cette propriété est définie par défaut sur 1,5 Go ou sur 75% de la RAM physique totale du système, selon la valeur la plus élevée.

Je vous conseille de vous familiariser avec la documentation du SDK.

+0

Oui. J'ai vu cet article. Mais cette limitation est-elle au niveau de l'application ou à une seule requête (Si j'ai un gros fichier tiff)? – Navaneet

+0

Lisez à nouveau la documentation et ma réponse - elle indique clairement la mémoire totale utilisée par TOUS les objets RasterImage alloués. –

+0

ok. Je devine que les objets RasterImage ne sont pas éliminés correctement. Ainsi, l'appel des méthodes d'élimination après l'utilisation d'objets peut aider. Parce que garbage collector ne peut pas les traiter automatiquement plus rapidement. L'appel va-t-il disposer de méthodes après l'utilisation des images raster? Une idée. – Navaneet