2013-03-07 4 views
0

AOT CUS 레이어를 XPO 파일로 내보내는 실험을하고 있습니다. 참조 this question. 내가 질문에 대한 답변에서 훌륭한 제안을 실행했지만 "메모리 부족"문제가 발생했습니다. 나는 좀 더 연구하고 약간의 실험을했다. 다음은 AOT 트리를 등반하고 "CUS"레이어에 속한 노드 만 내보내는 데 사용하는 알고리즘의 샘플입니다. 다음과 같이Dynamics AX 2012 메모리를 해제하지 않습니다.

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

TreeNode 개체는 대부분의 다른 개체와 마찬가지로 가비지 수집되지 않습니다. 너 혼자 풀어야 해. 노드를 다 마쳤 으면 treeNodeRelease()으로 전화하십시오.

+0

감사합니다. 나는이 릴리스가 조금 도움이되었다고 생각하지만, 메모리 요구량은 여전히 ​​매우 높습니다. 나는 nextnode = nextnode.AOTnextSibling()이 객체에 대한 참조를 잃어 버리는 경우이를 수행 할 것인지 궁금합니다. 내 메모리는 1GB의 970MB 밖에 없으므로 treenoderelease가 일부 메모리를 확보합니다. –

+0

@ScottVercuski 아마'nextSibling()'이 그 원인입니다. 'TreeNodeIterator' 객체를 사용하여 지금 가지고있는 루프가 아닌 자식 노드를 얻을 수 있습니다. 그런 다음 각 nextNode에 대해'treeNodeRelease()'를 호출 할 수 있습니다. iterator를 얻으려면 Treenode 클래스에'AOTIterator()'메소드가있다. –

+0

이상하게도 nextNode.AOTnextSibling()을 호출하기 전에 nextNode.treeNodeRelease()를 호출 했으므로 노드가 정상적으로 작동합니다. 나는 그것을 null이 될 것으로 예상했지만 그것은 작동하고 메모리를 공개했다. treeNodeRelease가 실제로 노드를 없애기를 기대했지만, 그럴 듯하지는 않습니다. 가비지 컬렉터가 돌아올 때 릴리스되도록 설정하는 것 같습니다. –