gpt4 book ai didi

c# - Linq查询blob列表,内存占用

转载 作者:行者123 更新时间:2023-11-30 12:23:28 25 4
gpt4 key购买 nike

各位开发者大家好,

我正在尝试使用 Linq 查询改进 Oracle 数据库中以 BLOB 格式存储的 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,则没有必要朝这个方向进一步发展 :(

最佳答案

有几种解决方案: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);

关于c# - Linq查询blob列表,内存占用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36617378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com