Azure 中的 System.OutOfMemoryException 但不是本地的

Sni*_*ipe 5 memorystream out-of-memory azure aspose.words

我有以下代码,它使用名为 Aspose.Words 的第三方库:

SaveOptions saveOptions = SaveOptions.CreateSaveOptions(SaveFormat.Docx);
saveOptions.MemoryOptimization = true;
saveOptions.TempFolder = Path.GetTempPath();
var mm = new RecyclableMemoryStreamManager();
using (RecyclableMemoryStream ms = new RecyclableMemoryStream(mm))
{
    doc.Save(ms, saveOptions);
    return ms.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

我在using语句中遇到以下错误。

Mvc.ExceptionHandling.AbpExceptionFilter - 引发“System.OutOfMemoryException”类型的异常。

我无法在本地重现它(在处理过程中我的内存使用量可能增加了 200mb,因此它实际上并没有使用太多内存)。文件本身大小仅为 56MB。Aspose 告诉我它最多可以使用该数量的 10 倍......即使如此也应该没问题。我已更改服务计划以扩展到 14GB 内存。

我正在使用 RecyclableMemoryStreamManager 因为我已经尝试使用 MemoryStream 但没有成功。

我还能做些什么来解决这个我只在 Azure(开发和生产)中遇到的问题?Azure API是.net核心堆栈,具有64位平台。

提前致谢。

Mad*_*han 6

您使用什么 Azure 服务产品?

大多数基于应用服务的产品(包括消耗计划中的 Azure Functions)每个进程/应用的内存上限为 1.5GB,无论你选择哪种应用服务定价计划。消耗计划中的 Azure 函数的最大内存限制为 1.5GB每个函数应用实例 (扩展可以允许多个实例),其他产品也有限制,以防止您吞噬底层计算机的所有内存。(您当地的环境没有这些限制)

如果没有实际的指标,很难解决这个问题。运行您的代码,然后在崩溃后等待几分钟并查看应用程序的指标,尤其是在工作内存和专用字节下。这些可以在应用服务的指标部分找到。

如果这些在你崩溃之前就达到了极限,这可能就是原因。如果是这种情况,您在 Azure 中的选项是

  • 减少内存占用
    • 优化当前工作,使其使用更少的内存
    • 或者将工作分成多个作业,每个作业使用较少的内存并使用 Azure Functions 或类似的
  • 使用应用程序服务环境(大量内存,隔离网络,但不便宜)
  • 使用虚拟机(Azure为几乎任何大小的虚拟机提供了内存优化)