1

在我的 Web 应用程序中,我使用 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);
    }
}

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

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

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

4

2 回答 2

3

您报告的错误引用了MaximumGlobalRasterImageMemory

您已超出 RasterImage 分配允许的内存量。请参阅 RasterDefaults::MemoryThreshold::MaximumGlobalRasterImageMemory。

文档中它指出:

获取或设置一个值,该值指定所有 RasterImage 对象分配允许的最大大小。

在分配新的 RasterImage 对象时,如果新的分配导致所有已分配的 RasterImage 对象使用的总内存超过 MaximumGlobalRasterImageMemory 的值,则分配会抛出异常。

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

这些是指定的默认值:

在 x86 系统上,此属性默认为 1.5 GB。

在 x64 系统上,此属性默认为 1.5 GB 或系统总物理 RAM 的 75%,以较大者为准。

我建议您熟悉 SDK 的文档。

于 2017-04-05T09:28:51.753 回答
1

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

  • 避免加载所有页面并将它们添加到内存中的一个 RasterImage。而是循环遍历它们并一次加载一个(或几个),然后将它们附加到输出文件而不将它们保存在内存中。随着页数的增加,附加到文件可能会变慢,但是这个帮助主题解释了如何加快速度。
  • 您的代码中有“使用(RasterCodecs 编解码器 ..)”,但大内存用于图像,而不是编解码器对象。考虑将您的 RasterImage 对象包装在“使用”范围内以加快其处置速度。换句话说,选择“使用(RasterImage image = ...)”
  • 显而易见的建议是:选择 64 位,安装尽可能多的 RAM,并增加 MaximumGlobalRasterImageMemory 的值。
于 2017-04-06T20:47:55.993 回答