0

我有一个带有简单页面的网站。单击一个按钮,我们执行一个 MDX 查询,该查询返回大约 200,000 行和 20 列。我使用以下代码使用 Microsoft.AnalysisServices.AdomdClient 库执行 MDX 查询(版本为 10.0.0.0 运行时版本 v2.0.50727)

        var connection = new AdomdConnection(connectionString);
        var command = new AdomdCommand(query, connection)
        {
            CommandTimeout =  900
        };

       connection.ShowHiddenObjects = true;
       connection.Open();
       var cellSet = command.ExecuteCellSet();
       connection.Close();

当查询正在执行时,应用程序池的内存使用量变得非常高。

这是服务器上内存使用的初始状态: 初始状态

运行查询后: 在此处输入图像描述

我不确定为什么内存使用率如此之高并保持不变。我在本地机器上使用了探查器,一切看起来都很好。

我必须找出哪些选项保留在内存中?

有什么明确的方法可以清除这个记忆吗?

ADOMD 库是否总是消耗这么多内存?我们是否有任何替代选项来使用 C# 执行 MDX 查询?

当内存使用量如此之高时,IIS 将停止处理其他查询,并且托管在同一 IIS 服务器上的应用程序(使用不同的应用程序池)也会受到影响,并且请求需要更长的时间才能执行。

4

1 回答 1

0

我最近开始在一个我们有类似问题的地方。

找出持有内存的选项有:

  1. 下载诸如 Redgate 的 Ants 分析器之类的内存分析器,这将允许您查看应用程序池中发生的情况。但是只有 2 周的试用期,但可以让您了解最初的情况。

  2. 掌握CLR Profiler,这个工具可以下载并让你看到内存的快照,这样你就可以知道CLR中的内存是什么。

要注意的一件事是大对象堆,根据设计,CLR 不会压缩 LOH 中的空间,因此如果将对象放在那里,则可能导致内存碎片。大于 85000 字节的对象会放在那里。一个例子是大型对象列表。

我尝试做的一件事是创建一个专门的集合,如复合列表,它基本上是一个列表列表,然后由于每个组件列表低于 85000 字节,它将保留在正常堆中并且整个对象未命中被放入 LOH。其他人也提到了这种方法。

也就是说,我仍然遇到问题,因为综合列表并没有真正解决问题,所以还有其他因素需要解决。我对此感到困惑,并认为应用程序池的内存转储并使用 winDbg 进行分析可能会提供进一步的答案。

还有一点,虽然我确定它不是问题的根源,但它建议为您的连接使用 using 语句,否则如果您的 close 语句之前有异常,那么它可能不会被关闭。

于 2013-06-05T11:52:33.370 回答