2013-03-07 2 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; 
      } 
     } 
    } 
} 

Суть этого алгоритма заключается в следующем: я хочу, чтобы спуститься вниз по дереву АОТ (начиная с конкретного узла) и экспортировать любой слой, который является «ЦУС» объект слоя. Я перестаю спускаться по дереву в «maxlevel», а это означает, что я только иду на X уровней глубоко в дерево. В настоящее время я выполняю этот алгоритм только на узле «Словарь данных» дерева AOT.

Проблема, с которой я сталкиваюсь, заключается в том, что при выполнении этого задания объем памяти процесса AX32.exe составляет почти 1 ГБ. Если я запускаю этот код против нескольких узлов, потребность в памяти продолжает расти. Мне любопытно, почему AX не освобождает память, когда алгоритм закончен. Мои исследования в Google придумывают некоторые проблемы с сборкой мусора AX. Я хотел бы знать, есть ли способ заставить сборку мусора в AX? Если я пытаюсь экспортировать каждый узел в AOT, я запускаю исключение «Out Of Memory». Память не будет выпущена, пока я не закрою клиент AX32.exe.

ответ

4

Объекты TreeNode не являются мусором, собранным, как и большинство других объектов. Вы должны выпустить его самостоятельно. Вызовите treeNodeRelease(), когда закончите с узлом.

+0

Спасибо! Я думаю, что релиз немного помог, но мои требования к памяти по-прежнему чрезвычайно высоки. Мне интересно, когда я делаю nextnode = nextnode.AOTnextSibling(), если он теряет ссылку на объект. Моя память составляет всего 970 МБ с объемом 1 ГБ, поэтому treenoderelease освобождает часть памяти. –

+0

@ScottVercuski Вы, вероятно, правы, что 'nextSibling()' является причиной. Вы можете попробовать использовать объект TreeNodeIterator, чтобы получить дочерние узлы, а не цикл, который у вас есть. Затем вы можете вызвать 'treeNodeRelease()' для каждого nextNode. Для получения итератора существует метод 'AOTIterator()' в классе Treenode. –

+0

как ни странно Я вызвал nextNode.treeNodeRelease() прямо ПЕРЕД Я вызывал nextNode.AOTnextSibling(), и узел был в порядке. Я ожидал, что он будет нулевым, но он сработает и освободит память. Это довольно противоречивое имя, поскольку я ожидал, что treeNodeRelease фактически уничтожит узел, но это, похоже, не так. Похоже, что это просто означает, что он будет выпущен, когда появится сборщик мусора. –

Смежные вопросы