用Java读取大型XML文件的最快方法

时间:2015-08-28 22:47:15

标签: java xml xml-parsing data-mining information-retrieval

我正在研究一个java项目来优化现有代码。目前我正在使用BufferedReader / FileInputStream在Java中将XML文件的内容读取为String。

但我的问题是,是否有更快的方式来读取XML内容。SAX / DOM比BufferedReader / FileInputStream快吗?

需要有关上述问题的帮助。

提前致谢。

2 个答案:

答案 0 :(得分:5)

我认为在其他问题中显示的代码比类似DOM的解析器更快,这肯定需要更多内存并且可能需要一些计算才能完全重建文档。您可能希望对代码进行概要分析。

如果您使用javax XMLStreamReader,我也认为您的代码可以为流处理做一些调整,我发现这对许多任务非常有帮助。该类" ...旨在成为读取XML数据的最低级别和最有效的方式",according to Oracle

以下是我的代码摘录,其中我解析了作为公共数据转储分发的StackOverflow用户XML文件:

// the input file location
private static final String fileLocation = "/media/My Book/Stack/users.xml";

// the target elements
private static final String USERS_ELEMENT = "users";
private static final String ROW_ELEMENT = "row";

// get the XML file handler
//
FileInputStream fileInputStream = new FileInputStream(fileLocation);
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(
    fileInputStream);

// reading the data
//
while (xmlStreamReader.hasNext()) {

  int eventCode = xmlStreamReader.next();

  // this triggers _users records_ logic
  //
  if ((XMLStreamConstants.START_ELEMENT == eventCode)
      && xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {

    // read and parse the user data rows
    //
    while (xmlStreamReader.hasNext()) {

      eventCode = xmlStreamReader.next();

      // this breaks _users record_ reading logic
      //
      if ((XMLStreamConstants.END_ELEMENT == eventCode)
          && xmlStreamReader.getLocalName().equalsIgnoreCase(USERS_ELEMENT)) {
        break;
      }
      else {

        if ((XMLStreamConstants.START_ELEMENT == eventCode)
            && xmlStreamReader.getLocalName().equalsIgnoreCase(ROW_ELEMENT)) {

          // extract the user data
          //
          User user = new User();
          int attributesCount = xmlStreamReader.getAttributeCount();
          for (int i = 0; i < attributesCount; i++) {
            user.setAttribute(xmlStreamReader.getAttributeLocalName(i),
                xmlStreamReader.getAttributeValue(i));
          }
          // all other user record-related logic
          //

        }
      }
    }
  }
}

用户文件格式非常简单,类似于Bank.xml文件:

<users>
  <row Id="1567200" Reputation="1" CreationDate="2012-07-31T23:57:57.770" DisplayName="XXX" EmailHash="XXX" LastAccessDate="2012-08-01T00:55:12.953" Views="0" UpVotes="0" DownVotes="0" />
  ...
</users>

答案 1 :(得分:0)

有不同的解析器选项。

考虑使用流式解析器,因为DOM可能变得非常大。即推送或拉取解析器。

并不是说XML解析器必然很慢。考虑您的网络浏览器。它一直进行XML解析,并且很难对语法错误进行强大的修改。通常,记忆是一个更大的问题。