QVConnect.exe使用SAP OLAP Connector在QlikView中导致内存不足错误

时间:2014-07-30 18:42:33

标签: qlikview

我经常需要在QlikView中一次性从SAP Business Warehouse(BW)中提取数月和数月的数据,为此我使用QlikView自己的SAP OLAP Connector。

我决定将它们放在for-next循环中,如下所示,而不是只有月份和年份参数更改的同一SAP Connector脚本的无限重复:

CUSTOM CONNECT TO "Provider=QvSAPOLAPConnector.dll;MSHOST=server1;R3NAME=SBW;GROUP=;CLIENT=100;Log=1;XUserId=ABCDEFG;XPassword=ABCDEFG;";

FOR Month = 1 TO 12
    LET MonthValue = date(addmonths(StartDate, $(Month) - 1),'YYYYMM');

    MyData: 
    LOAD
    *;
    SELECT
    PseudoMDX D (
        Dimensions (
            [0MATERIAL] (),
            [0SALESORG] ()
        ),
        Measures (
            [4VHMY6XTAN8117F8FC78GMG72].[4VHMY7D6CKFG2GI4R0BX0QDMM], // Sales
        ),
        Variables (
            [S_CALM_N] (I = [0CALMONTH].[$(MonthValue)])
        ),
    From (CUBE01/QUERY01));
NEXT

现在,这适用于相对较小的结果集,因为内存要求在合理的限制范围内(我监视QlikView连接器qvconnect.exe / qvconnect64.exe - 64位)。

但是,我发现如果你运行了大量的循环,即使你没有在每个循环中返回很多行,QlikView也会经常停止加载"内存不足"信息。

如果不使用单独脚本的单独文档,我该如何避免这种情况发生?

1 个答案:

答案 0 :(得分:0)

这样做的原因是qvconnect.exe / qvconnect64.exe似乎不在循环(或实际上PseudoMDX语句)之间进行垃圾收集,因此其内存占用将稳定增加,直到你的循环/脚本完成或你的机器内存不足。

我不确定为什么该进程拒绝放弃其内存,也许它正在尝试缓存一些维度值以供以后使用。我个人看到几个服务器作业失败,因为qvconnect.exe决定吃掉所有10GiB的内存!

我找不到关于这个主题的任何官方文档,但简单的解决方案是在循环中移动CUSTOM CONNECT语句:

FOR Month = 1 TO 12
    LET MonthValue = date(addmonths(StartDate, $(Month) - 1),'YYYYMM');

    CUSTOM CONNECT TO "Provider=QvSAPOLAPConnector.dll;MSHOST=server1;R3NAME=SBW;GROUP=;CLIENT=100;Log=1;XUserId=ABCDEFG;XPassword=ABCDEFG;";

    MyData:
    LOAD
    *;
    SELECT
    PseudoMDX D (
        Dimensions (
            [0MATERIAL] (),
            [0SALESORG] ()
        ),
        Measures (
            [4VHMY6XTAN8117F8FC78GMG72].[4VHMY7D6CKFG2GI4R0BX0QDMM], // Sales
        ),
        Variables (
            [S_CALM_N] (I = [0CALMONTH].[$(MonthValue)])
        ),
    From (CUBE01/QUERY01));
NEXT

在循环执行时观察qvconnect.exe的内存占用量,表明在从SAP BW返回数据时内存使用量增加,但在下一个循环周期开始时将释放。