使用流的高内存使用解决方案

Posted

技术标签:

【中文标题】使用流的高内存使用解决方案【英文标题】:High memory usage solutions with streams 【发布时间】:2021-06-27 16:56:26 【问题描述】:

我有一个关于如何在 C# 中解决高内存使用问题的问题。

假设我在数据库中有很多项目数据。我想阅读所有内容,然后将该数据写入单独的文件并将其存档到 zip 文件中。如果我一次从数据库中获取所有项目数据,应用程序将超时,因为所有内存都已使用。 我们在 node js 应用程序中所做的事情是找到一个方便的库,并使用 AsyncEnumerable 并将项目数据以较小的片段流式传输到写入流。 所以我的问题是它是如何在 C# 中完成的?因为我还没有找到如何通过实体框架流式传输数据的选项?它是如何解决的,任何人都可以提供一些可以使用的代码 sn-ps/示例,是 IQueryable 还是其他? 我对当时如何从流中读取 10000 个元素的数据感兴趣。

【问题讨论】:

【参考方案1】:

默认情况下,数据在 EF 中流式传输,您无需执行任何操作。将整个响应存储在内存中的是 ToList() 和朋友,如果您仅枚举可查询对象,它将处理枚举器中的任何流。

【讨论】:

EF 能否使用流处理 2G(或更多)的 blob 属性?我知道它可以使用 byte[] 但你永远不会有一个带有 byte[] 的端到端流 EF 是面向“实体”的,因此您一次流式传输一个实体。所以拥有 2GB 的实体不是很实用。对于流式 blob,您必须下拉到 ADO.NET:docs.microsoft.com/en-us/dotnet/framework/data/adonet/… @DavidBrowne-Microsoft - 谢谢,我就是这么想的。我认为这是一个很大的缺失功能(实际上我不使用 EF 的主要原因)。 有没有办法限制最大内存使用的大小?

以上是关于使用流的高内存使用解决方案的主要内容,如果未能解决你的问题,请参考以下文章

Redis 限流的3种方式,还有谁不会

nodejs+koa以流的形式返回数据

UICollectionView 中的高内存使用 [重复]

使用 PHP 图像调整大小/裁剪内置方法的高内存使用率

在 C 标准库中使用内存流的目的是啥?

SevenZipSharp - 压缩内存流