0

AOTCUSレイヤーをXPOファイルとしてエクスポートすることを試みています。この質問を参照してください。上記の質問に対する回答から優れた提案を実行しましたが、「メモリ不足」の問題が発生しています。私はいくつかのさらなる研究といくつかの追加の実験を行いました。これは、AOTツリーを降りて、「CUS」レイヤーに属するノードのみをエクスポートするために使用しているアルゴリズムのサンプルです。

private void GetAOLHelper(TreeNode baseNode, str baseExportDirectory, int currentLevel, int maxLevel)
{
    int cusLayerTest;
    int CusLayerValue = 4096;
    str ExportFileName = "";
    str ExportDirectoryName = "";
    TreeNode nextNode;

    if (baseNode != null)
    {
        cusLayerTest = CusLayerValue & baseNode.applObjectLayerMask();
        if (cusLayerTest > 0)
        {
            ExportFileName = baseNode.AOTname() + ".xpo";
            this.NodeExport(baseNode, baseExportDirectory, ExportFileName);
        }
        else
        {
            if (currentLevel < maxLevel)
            {
                nextNode = baseNode.AOTfirstChild();
                while (nextNode != null)
                {
                    this.GetAOLHelper(nextNode, baseExportDirectory, currentLevel + 1, maxLevel);
                    nextNode = nextNode.AOTnextSibling();
                }
                nextNode = null;
            }
        }
    }
}

このアルゴリズムの要点は次のとおりです。AOTツリー(特定のノードから開始)を降りて、「CUS」レイヤーオブジェクトであるレイヤーをエクスポートしたいと思います。「maxlevel」でツリーを降りるのをやめます。つまり、ツリーの奥深くにXレベルしか入りません。現在、このアルゴリズムはAOTツリーの「データディクショナリ」ノードでのみ実行しています。

私が直面している問題は、このジョブを実行すると、AX32.exeプロセスのメモリフットプリントがほぼ1GBになることです。このコードを複数のノードに対して実行すると、メモリ要件が増え続けます。アルゴリズムが終了したときにAXがメモリを解放しない理由について知りたいです。Googleに関する私の調査では、AXガベージコレクションに関するいくつかの問題が発生しています。AXでガベージコレクションを強制する方法があるかどうか知りたいですか?AOT内のすべてのノードをエクスポートしようとすると、前述の「メモリ不足」の例外が発生します。AX32.exeクライアントを閉じるまでメモリは解放されません。

4

1 に答える 1

3

TreeNodeオブジェクトは、他のほとんどのオブジェクトのようにガベージコレクションされません。自分でリリースする必要があります。ノードを使い終わったら呼び出しtreeNodeRelease()ます。

于 2013-03-07T15:30:44.433 に答える