读取大文件时,Java Stax解析器的问题



我正在尝试使用具有近180k行的Stax Parser读取XML文件。核心逻辑在数据结构中寻找某些标签,属性和存储。对于这种类型的大文件,Stax解析器需要大量时间。它需要将近15分钟的时间,没有任何核心逻辑,只是在循环中迭代。

while (eventReader.hasNext()) { }

我在同一文件上尝试了SAX解析器,以读取标签。它非常快,在几秒钟内完成。

Stax解析器会有什么问题。请建议任何适合大型文件的XML解析器,并在内存和空间利用率方面表现良好。?

调用 hasNext()始终返回true,除非您达到输入的末尾,并且您的代码不会在输入中更改位置,因为它永远不会读取任何数据。您需要在循环中调用next(),然后最终hasNext()将返回false。

顺便说一句,按照现代标准,180k线并不是一个大文件。

坚持使用Stax解析器,因为SAX和Stax都遵循用于解析XML的流式编程模型,我在sax和stax上均使用了示例代码,这是结果

SAX解析器:总时间:10.73毫秒最大内存:1842688分配的内存:125952免费内存:107293

Stax解析器:总时间:7.5毫秒最大内存:1842688分配的内存:125952免费内存:120611

stax是拉动API,而SAX是推动API表示,如果stax解析器,当客户端应用程序需要与XML Infoset进行交互时,client application call applser call call a api api api是一种puth api。XML数据明确要求它。但是,如果SAX解析器,XML解析器将(PUSTES(XML数据发送给客户端,因为解析器遇到XML Infoset中的元素,也就是Parser,是否发送数据。或者当时客户准备使用它。Stax API可以阅读并编写XML文档。使用SAX API,只能读取XML文件。

Stax代码:

public static void main(String[] args) throws FileNotFoundException, XMLStreamException {
        XMLInputFactory xf=XMLInputFactory.newInstance();
        XMLStreamReader xsr=xf.createXMLStreamReader(new InputStreamReader(new FileInputStream("C:\Users\RNayyar\Desktop\Context\processedFiles\post.xml")));
        String startElement = null;
        String endElement  =null;
        String elementTxt = null;
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy HH:mm:ss");
        while (xsr.hasNext()) {
            int e = xsr.next();
            if(e==XMLStreamConstants.START_ELEMENT){
                //System.out.println("StartElement Name :" + xsr.getLocalName());
                startElement = xsr.getLocalName();
            }
            if(e==XMLStreamConstants.END_ELEMENT){
                //System.out.println("EndElement Name :" + xsr.getLocalName());
                endElement = xsr.getLocalName();
                if(startElement.equalsIgnoreCase(endElement))
                System.out.println(" ElementName : "+ startElement + " ElementText : " + elementTxt);
            }
            if(e==XMLStreamConstants.CHARACTERS){
                //System.out.println("Element TextValue :" + xsr.getText());
                elementTxt = (xsr.getText().contains("n")) ? "" : xsr.getText();
            }
        }
    }

最新更新