是什么导致OOM在这里

时间:2016-08-17 12:45:19

标签: c# mysql asp.net wcf out-of-memory

我有一个.NET 3.5 Web应用程序,它允许用户生成各种自定义数据集的PDF报告。报告是使用JSON在单独的报告生成器服务器(也是.NET WCF服务)上通过Web服务调用生成的。 Web应用程序将报告的二进制数据本地缓存在MySQL数据库中一段可配置的临时时间,因此如果再次请求相同的报告,则从本地缓存提供该报告。生成的报告响应的WCF合同如下:

[DataContract]
public class GetReportBase64EncodedReply
{
    [DataMember]
    public string Base64EncodedFile { get; set; }
    [DataMember]
    public string Md5 { get; set; }
    [DataMember]
    public string Filename { get; set; }
    [DataMember]
    public int Size { get; set; }
    [DataMember]
    public int Status { get; set; }
}

在接收端(Web应用程序),报告作为Base64编码字符串作为上述合同收到,并按如下方式处理:

GetReportBase64EncodedReply reportResult = (GetReportBase64EncodedReply)serviceResponse.Data;
byte[] bytes = Convert.FromBase64String(reportResult.Base64EncodedFile);
var expiryDate = DateTime.UtcNow.AddDays(180);
var cachedReport = new LocalDbStorageAction.Insert(bytes, expiryDate);

在尝试将二进制数据插入本地数据库时,它已经运行了一段时间,现在在最后一行抛出系统内存异常。也无法在开发中重现这一点。我正在考虑以下内容,但需要一些指导:

  1. 整个报告将作为base64字符串立即下载 可以改为顺序下载。
  2. 在本地存储之前将整个字节数组保存在内存中,这可以更改为附加到使用的临时文件 第1步,转移完成后,阅读文件(例如 File.ReadAllBytes())并存储在本地数据库中。
  3. 更改1和/或2的内存使用情况有何不同? 有没有办法做一个连续的SQL INSERT(类似于顺序读取,即GetBytes()和GetChars()),如果是这样,那么这里推荐?

0 个答案:

没有答案