【问题标题】:It is possible to stream a large SQL Server database result set using Dapper?可以使用 Dapper 流式传输大型 SQL Server 数据库结果集吗?
【发布时间】:2015-12-09 01:43:52
【问题描述】:

我需要从数据库返回大约 500K 行(请不要问为什么)。

然后我需要将这些结果保存为 XML(更 URGH)和 ftp 这个文件到某个神奇的地方。

我还需要转换结果集中的每一行。

现在,这就是我正在做的说 ..TOP 100 结果:

  • 使用 Dapper 的 Query<T> 方法,将整个结果集扔到内存中
  • 然后我使用 AutoMapper 将数据库 POCO 转换为我的 FileResult POCO
  • 转换为 XML
  • 然后将此集合保存到文件系统中
  • 然后是 FTP

这适用于 100 行,但在尝试将 500K 结果转换为新集合时,我遇到 AutoMapper 出现内存不足异常。

所以,我想知道我是否可以这样做......

  • 使用 Dapper 从 DB 流式传输数据
  • 对于每一行,自动映射它
  • 转换为 XML
  • 将结果流式传输到磁盘
  • 现在将该文件 ftp 到魔法世界

我正在尝试停止将 所有内容 放入 RAM。我的想法是,如果我可以流式传输内容,那么内存效率会更高,因为我只处理单个结果数据集。

【问题讨论】:

标签: c# sql-server stream dapper


【解决方案1】:

使用 Dapper 的 Query<T> 方法,将整个结果集扔到内存中

那么,一个可选参数是bool,让您选择是否缓冲;p

只需将, buffer: false 添加到您对Query<T> 的现有呼叫中即可。

【讨论】:

  • 这如何改变执行这个Query<T> / QueryAsync<T>的代码?如果它没有缓冲,那么我如何提取数据并逐行处理?还是有别的窍门?
  • @Pure.Krome 在这两种情况下,您只需foreach 处理数据 - 它是开放阅读器上的迭代器块。注意:如果你不想使用foreach,那么你只需使用GetEnumerator()MoveNext()(检查返回值)和Current(记得在最后处理枚举数); foreach(var x in y) {...} 基本上是:using(var iter = y.GetEnumerator()) { while(iter.MoveNext()) { var x = iter.Current; ... } }
  • 现在 Query 和 QueryAsync 没有可以添加缓冲区的简单签名的建议是什么:false?
  • @steve 在下一个“主要”中,我们将粉碎 API,以便有一个 List-T 版本(缓冲)和一个 IAsyncEnumerable-T 版本(非缓冲)。现在,您可能需要使用带有命令包装器的版本,而不仅仅是一个字符串。
猜你喜欢
  • 2011-04-13
  • 2016-06-23
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多