Я экспериментирую с экспортом слоя 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.
Спасибо! Я думаю, что релиз немного помог, но мои требования к памяти по-прежнему чрезвычайно высоки. Мне интересно, когда я делаю nextnode = nextnode.AOTnextSibling(), если он теряет ссылку на объект. Моя память составляет всего 970 МБ с объемом 1 ГБ, поэтому treenoderelease освобождает часть памяти. –
@ScottVercuski Вы, вероятно, правы, что 'nextSibling()' является причиной. Вы можете попробовать использовать объект TreeNodeIterator, чтобы получить дочерние узлы, а не цикл, который у вас есть. Затем вы можете вызвать 'treeNodeRelease()' для каждого nextNode. Для получения итератора существует метод 'AOTIterator()' в классе Treenode. –
как ни странно Я вызвал nextNode.treeNodeRelease() прямо ПЕРЕД Я вызывал nextNode.AOTnextSibling(), и узел был в порядке. Я ожидал, что он будет нулевым, но он сработает и освободит память. Это довольно противоречивое имя, поскольку я ожидал, что treeNodeRelease фактически уничтожит узел, но это, похоже, не так. Похоже, что это просто означает, что он будет выпущен, когда появится сборщик мусора. –