【问题标题】:Linq query list of blob, memory usagelinq查询blob列表,内存使用情况
【发布时间】:2016-08-05 16:03:56
【问题描述】:

各位开发者您好,

我正在尝试使用 Linq 查询改进以 BLOB 格式存储在 Oracle 数据库中的 XML 对象列表的导出。

遗憾的是,其中一个 BLOB 非常大,当我阅读它时,内存使用量增加到 2 GB。我的 fileSet 对象是一个 IQueryable<myRecord> 对象。 我试过了

foreach (var file in fileSet){...}

var files = fileSet.ToList(); //This time the list is causing the memory load.
foreach(file in files){...}

var e = fileSet.AsEnumerable().GetEnumerator();
while(e.MoveNext()){...}

但每次我达到列表中的大记录时,内存都会被过度使用。 为了创建导出,我一直在寻找一些使用 Buffer.BlockCopy 的代码,但由于内存过度充电,如果您知道如何减少内存使用或延迟加载每个 blob,那么在这个方向上没有任何意义: (

【问题讨论】:

  • 您是否需要在处理过程中加载一个 blob,或者它只是因为 fileSet 的记录定义有这个 blob 字段而发生?
  • @SergeyL 我需要blob,这个软件正在加载这些blob并将它们导出到xls文件中,里面基本上是xml。

标签: c# linq memory blob


【解决方案1】:

有几种解决方案: 1)将 AsNoTracking() 添加到您的查询中。

fileSet.AsNoTracking() or fileSet.AsNoTracking().Where(...) 

AsNoTracking() 帮助垃圾收集器释放记录,因为记录不会被缓存在数据库上下文中。但正如您所知,它不会立即采取行动,您仍然可能会局部增加消耗的内存。

2) 您可以为您的记录创建一个不包含 blob 字段的单独定义,并通过它获取文件列表或使用选择表达式,它也可能有所帮助,但您应该检查它是如何转换为 sql

fileSet.AsNoTracking().Select(x=>new { x.Id, x.Name })

然后处理每条记录,您将明确获得一个 blob

var myblob = model.Database
    .SqlQuery<string>("select myblob from mytable where id=@id", 
         new SqlParameter("@id", System.Data.SqlDbType.Int) { Value = myId })
    .FirstOrDefault();

var myBlob = fileSet
       .AsNoTracking()
       .Select(x=>new { x.Blob )
       .FirstOrDefault(x=>x.ConfigId=myId);

【讨论】:

  • 感谢您的回答。因为我仍然在 EF 4.0 上,所以我无法访问 AsNoTracking() 所以我尝试了 fileSet.SetMergeOption(MergeOption.NoTracking); 但它并没有改变结果,在加载大 blob 的对象后仍然有很多内存使用。但我会继续搜索这个,如果我的经理没事的话,也许会更新我的 EF ^^
【解决方案2】:

最后,因为我无法通过 linq 管理内存中的内容,所以在我使用 linq 获得文件 ID 后,我使用 OracleCommand 流式传输 xml 文件。

using (var reader = cmd.ExecuteReader())
{
   while (reader.Read())
   {
      var blob = reader.GetOracleLob(0);
      var buffer = new byte[128];
      using (var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.Write))
      {
          blob.CopyTo(fs);
      }
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-26
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2015-10-11
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多