Переработка структур данных в Java

Я создал программу, которая может читать XML-файл и выводить значения из него. XML-файл, который он обрабатывает, очень большой и содержит около 40000 записей различных данных, поэтому я создал общий класс TreeNode для обработки каждой из этих записей. Тем не менее, поскольку моя программа обрабатывает каждую запись данных, создавая объект TreeNode, она начинает занимать много места в ОЗУ, пока не исчерпает пространство, пока не достигнет конца. Я знаю, что вы можете переработать свою структуру данных, но я посмотрел в Интернете, чтобы узнать, как вы можете это сделать, и до сих пор я не нашел способа сделать это. Я знаю, что вы можете вызывать recycle() для объектов, но по какой-то причине он не работает на моем TreeNode. Мне было интересно, знает ли кто-нибудь, как я могу реализовать recycle в своем коде, чтобы помочь мне преодолеть эту проблему, или каким-либо другим способом, которым я могу преодолеть мою проблему.

Мой код ниже (я знаю, что это не самый лучший и самый эффективный способ сделать это, но он работает):

public class XML {

    TreeNode root;

    public XML(){

        try{

            InputStream file = new FileInputStream("/Users/Kevlar/Dropbox/PhD/Java/Metabolites/testOutput.xml");
            XMLInputFactory inputFactory = XMLInputFactory.newInstance();

            XMLStreamReader reader = inputFactory.createXMLStreamReader(file);

            reader.nextTag();

                do{
                    if(reader.getEventType() == XMLStreamConstants.START_ELEMENT && reader.getLocalName() == "metabolite"){
                        printChildren(mainElements(reader).children());

                    }

                    else{
                        reader.next();
                    }
                } while(reader.hasNext());


        }   catch (XMLStreamException e){
            System.err.println("XMLStreamException : " + e.getMessage());

        }   catch (FactoryConfigurationError e){
            System.err.println("FactoryConfigurationError : " + e.getMessage());

        }   catch (FileNotFoundException e){
            System.err.println("FileNotFoundException : " + e.getMessage());

        }
    }

private TreeNode mainElements(XMLStreamReader reader) throws XMLStreamException {

        Element rootElement = new Element();
        rootElement.setName(reader.getLocalName());
        System.out.println(rootElement.getName());
        root = new TreeNode(rootElement);

        int level = 1;

        do{
            int event = reader.next();

            if(event == XMLStreamConstants.START_ELEMENT) {

                Element element = new Element();
                element.setName(reader.getLocalName());
                TreeNode node = new TreeNode(element);
                level++;

                if(level == 2){
                    root.add(subElements(reader, node));
                    level--;

                }

            } else if(event == XMLStreamConstants.END_ELEMENT){
                level--;
            }

        } while(level > 0);

        return root;
    }

private TreeNode subElements(XMLStreamReader reader, TreeNode node) throws XMLStreamException {

    int level = 1;

    do{
        int event = reader.next();

        if(event == XMLStreamConstants.START_ELEMENT) {

            Element subElement = new Element();
            subElement.setName(reader.getLocalName());
            TreeNode subNode = new TreeNode(subElement);
            level++;

            if(level == 2){
                node.add(subElements(reader, subNode));
                level--;
            }

        } else if(event == XMLStreamConstants.CHARACTERS && !reader.isWhiteSpace()){

            node.getElement().setValue(reader.getText());

        } else if(event == XMLStreamConstants.END_ELEMENT){
            level--;
        }

    } while(level > 0);

    return node;
}

private void printChildren(TreeNode[] children) {

    for(int i = 0; i < children.length; i++){
        TreeNode node = children[i];
        if(node.hasChildren()){
            System.out.println("Element:- " + node.getElementName());
            printChildren(node.children());
        }

        else if(!node.hasChildren()){
            System.out.println("Element:- " + node.getElementName());
            System.out.println("Value:- " + node.getElementValue());
        }
    }



}

public static void main(String[] args) throws XMLStreamException{

    XML test = new XML();

}

}

0 ответов

Другие вопросы по тегам