Рекурсия опасна для обхода больших наборов данных, так как память стека практически не находится под вашим контролем. (Другими словами: я выучил рекурсию в школе как «самое элегантное» решение, и как «не делай» в университете - пойди разберись ...)
Чтобы устранить это, используйте подходящую структуру данных для развертывания, например, очередь по этим направлениям:
Deque<MyObject> queue = ...
queue.push(rootElement);
while (!queue.isEmpty()) {
MyObject currentElement = queue.poll();
// ... process current element
// and in the end: push children
currentElement.getChildren().forEach(child -> queue.push(child));
}
Для обхода в глубину используйте вместо этого стек (т.е. pop()
вместо poll()
);
Если это по-прежнему приводит к ошибкам памяти, вам придется либо увеличить пространство кучи, либо использовать совсем другой подход.