Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xml工具设计问题_Java_Xml_Cpu_Ram - Fatal编程技术网

Java xml工具设计问题

Java xml工具设计问题,java,xml,cpu,ram,Java,Xml,Cpu,Ram,我在一次采访中被问到这个问题。当然,解决方案有很多方法,但我只是想知道是否有一些真正最好的方法脱颖而出。有一个2gb的巨大xml文件存储在具有512 mb RAM的低端PC的硬盘中。 xml文件存储时间戳和相应的字符串值。我必须设计一个工具来解析xml文件以获取特定信息,例如特定时间戳中的字符串。面试官并不关心工具中的搜索技巧。他希望获得一个高水平的工具设计方法,只考虑512mn内存和2GB大小的工具。有什么有趣的设计方法吗?也许应该用SAX而不是DOM来完成解析。与DOM解析器一样,在访问数据

我在一次采访中被问到这个问题。当然,解决方案有很多方法,但我只是想知道是否有一些真正最好的方法脱颖而出。有一个2gb的巨大xml文件存储在具有512 mb RAM的低端PC的硬盘中。
xml文件存储时间戳和相应的字符串值。我必须设计一个工具来解析xml文件以获取特定信息,例如特定时间戳中的字符串。面试官并不关心工具中的搜索技巧。他希望获得一个高水平的工具设计方法,只考虑512mn内存和2GB大小的工具。有什么有趣的设计方法吗?

也许应该用SAX而不是DOM来完成解析。与DOM解析器一样,在访问数据之前,内存中有完整的文档。如果我理解您的意思是正确的,那么您从一开始就已经知道您感兴趣的时间戳,因此您可以使用SAX解析器来获取相应的字符串值,这应该更快,并且不会占用那么多内存。

有两种XML解析方法1)使用dom解析器2)使用SAX解析器。尝试使用dom解析器解析带有512B RAM的2GB文件肯定会导致内存不足异常,因此,使用sax解析器也会更快,因为您已经知道自己在寻找什么。

对于这个用例,我将使用Java SE 6中的StAXAPI,而不是sax。下面的代码来自一个。StAX用于将大型XML文件拆分为几个较小的文件:

import java.io.*;
import javax.xml.stream.*;
import javax.xml.transform.*;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;

public class Demo {

    public static void main(String[] args) throws Exception  {
        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
        xsr.nextTag(); // Advance to statements element

        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) {
            File file = new File("out/" + xsr.getAttributeValue(null, "account") + ".xml");
            t.transform(new StAXSource(xsr), new StreamResult(file));
        }
    }

}
下面是一个类似的答案,这里描述了如何使用StAX以块的形式处理XML文档。在他的回答中,JAXB用于处理块:

还有StAX解析器(
javax.xml.stream.*
)。StAX与SAX类似,但您可以拉取(请求)事件,而不是将它们推送到您的手中:还有StAX解析器(
javax.xml.stream.*
)。StAX与SAX类似,但您可以拉取(请求)事件,而不是将它们推送到您的手中: