2013-03-07 51 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」層對象的任何層。我停止在「最高級別」爬下樹,這意味着我只能在樹的深處進入X級。我目前只在AOT樹的「數據字典」節點上運行這個算法。

我正面臨的問題是,當此作業運行時,AX32.exe進程的內存佔用空間幾乎爲1 GB。如果我針對多個節點運行此代碼,內存需求會不斷攀升。我很好奇AX爲什麼在算法結束時不釋放內存。我對Google的研究正在出現一些關於AX垃圾收集的問題。我想知道是否有辦法在AX中強制垃圾收集?如果我試圖導出AOT中的每個節點,我會遇到前面提到的「內存不足」異常。在關閉AX32.exe客戶端之前,內存不會被釋放。

回答

4

TreeNode對象不像大多數其他對象那樣被垃圾回收。你必須自己釋放它。當您完成節點時,請致電treeNodeRelease()

+0

謝謝!我認爲這個版本有點幫助,但是我的記憶要求仍然非常高。我想知道如果我在執行nextnode = nextnode.AOTnextSibling()時是否失去對對象的引用。我的內存只有970 MB 1 GB的內存,所以treenoderelease釋放了一些內存。 – 2013-03-07 17:01:10

+0

@ScottVercuski你可能是正確的,'nextSibling()'是原因。您可以嘗試使用'TreeNodeIterator'對象來獲取子節點,而不是現在的循環。然後你可以爲每個nextNode調用'treeNodeRelease()'。 Treenode類有一個方法'AOTIterator()'來獲取迭代器。 – 2013-03-08 10:02:11

+0

奇怪的是,我調用nextNode.treeNodeRelease()之前,我調用nextNode.AOTnextSibling()和節點是好的。我期待它是空的,但它工作並釋放內存。這是一個相當反直覺的名字,因爲我期望treeNodeRelease實際銷燬節點,但似乎並非如此。似乎只是在垃圾收集器出現時纔會發佈它。 – 2013-03-08 14:59:50