【问题标题】:C# Linq query to return part of column valueC# Linq 查询返回部分列值
【发布时间】:2019-08-14 12:17:07
【问题描述】:

我收到 OutOfMemoryException,我相信这是因为包含我要从数据库中提取的数据的数据库列太大。有没有办法只能从列中检索前 X 个字符? IE,读取前 X 个字符,写入文件,读取接下来的 X 个字符直到列末尾,同时保存到文件?

此列包含 XML 数据,我想将存储的 XML 传输到文本文件中。

更新

回答下面发布的问题:

这是抛出 OutOfMemoryException 的 Linq 查询:

                  var output = db.ReportOutputs
                      .Where(i => i.ReportOutputId == rptoId)

                      .Select(i => new
                      {
                          i.ReportRun.ReportRunId,
                          //i.ReportOutputXml.ToString().Substring(1, 100),
                          i.ReportOutputXml,
                      }).FirstOrDefault();

针对@bradbury9,ReportOutputXml 是 XML 存储在报告运行表中的位置。

【问题讨论】:

  • 当你得到 OutOfMemoryException 时你能显示代码的平静吗?
  • 获取OutOfMemoryException 表明您正在尝试读取几 Gb 的数据,这不太可能是单个长列的原因。您是否有机会分享您的查询以及您尝试处理的数据量的粗略数量级?
  • 标记为xml,但谈论列。 minimal reproducible example 可以很好地了解问题。
  • 在处理大文件时避免内存问题的最佳方法是使用流,您可以读取流并即时写入所需的数据,而无需在内存中获取大量数据
  • 你有没有试过在outofmemory.com上提问,这里只能解决StackOverflowException?除了开玩笑,请参阅minimal reproducible example。提示:异常堆栈帧通常很有帮助,OOM 经常由于递归调用而发生,例如在属性设置器中访问相同的属性。

标签: c# xml linq out-of-memory


【解决方案1】:

感谢大家的想法。

我一直在使用的 DB2 版本中似乎存在什么问题。我在我的 Toad for DB2 实例中尝试了查询,并在双击数据集中的数据列以返回该特定列值时遇到相同的错误。

看来我的 Toad for DB2 4.0.1.921 副本是免费软件版本。我访问了 Quest 站点并获得了 DB2 的新副本,但没有注意到我点击了 FULL 版本,30 天试用版。使用 Toad for IBM DB2 7.0.7.106(非免费软件版本)时,我没有收到 OutOfMemoryException。

这个 OutOfMemoryException 可能是免费软件和完整版之间的 DB2 问题,或者是 DB2 4 和 DB2 7 之间的差异。或者在 Toad 中可能存在我找不到的 DB2 4.0.1.921 设置。

【讨论】:

    猜你喜欢
    • 2022-08-09
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多