Переработка структур данных в 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();
}
}