LeadTools MaximumGlobalRasterImageMemory

LeadTools MaximumGlobalRasterImageMemory

在我的网络应用程序中,我使用 LeadTools 从流创建多页 Tiff 文件。下面是一段代码,展示了我如何使用 leadtools。

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);
    }
}

以上代码工作正常,我的 Web 应用程序收到很多请求,大约有 2000 个请求。在某些情况下,我得到以下错误。但后来它再次适用于其他请求。

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

内存问题是针对单个请求还是针对应用程序启动期间的所有对象(全局对象)? 那么上述错误的解决方案是什么?

您报告的错误引用了 MaximumGlobalRasterImageMemory:

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

documentation 中指出:

Gets or sets a value that specifies the maximum size allowed for all RasterImage object allocations.

When allocating a new RasterImage object, if the new allocation causes the total memory used by all allocated RasterImage objects to exceed the value of MaximumGlobalRasterImageMemory, then the allocation will throw an exception.

所以看起来它适用于所有对象。

这些是指定的默认值:

On x86 systems, this property defaults to 1.5 GB.

On x64 systems, this property defaults to either 1.5 GB or 75 percent of the system's total physical RAM, whichever is larger.

我建议您熟悉 SDK 的文档。

处理包含许多页面的文件时,以下是一些对 Web 和桌面应用程序都有帮助的一般提示:

  • 避免加载所有页面并将它们添加到内存中的一个 RasterImage。而是循环遍历它们并一次加载一个(或几个),然后将它们附加到输出文件而不将它们保留在内存中。随着页数的增加,附加到文件的速度可能会变慢,但 this help topic 解释了如何加快速度。
  • 您的代码中有 "using (RasterCodecs codecs ..)",但大内存用于图像,而不是编解码器对象。考虑将 RasterImage 对象包装在 "using" 范围内以加快其处理速度。换句话说,选择 "using (RasterImage image = ...)"
  • 明显的建议是:选择 64 位,安装尽可能多的 RAM 并增加 MaximumGlobalRasterImageMemory 的值。