我在一次面试中被问到了这个问题。当然,有很多解决方案的方法,但只是想知道是否有一些真正最好的方法脱颖而出。在具有512MB RAM的低端PC的硬盘中存储有2 mb的巨大的xml文件。xml文件存储时间戳和相应的字符串值。我必须设计一个工具来解析xml文件以获取特定信息,例如特定时间戳中的字符串。面试官并不关心工具中的搜索技术。考虑到只有512mn的RAM和2 2GB的工具大小,他希望获得工具设计的高级方法。对此有没有什么有趣的设计方法?
发布于 2011-09-21 18:31:00
对于这个用例,我将使用 SE 6中的StAX API,而不是Java。下面的代码来自一个answer of mine to a similar question。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));
}
}
}下面是skaffman的类似回答,这里描述了如何使用StAX来处理分块的XML文档。在他的回答中,JAXB用于处理块:
发布于 2011-09-21 15:03:18
也许应该使用SAX而不是DOM来完成解析。与使用DOM解析器一样,在访问数据之前,您可以在内存中获得完整的文档。如果我理解正确的话,那么您从一开始就已经知道了您感兴趣的时间戳,所以您可以使用SAX解析器来获取相应的字符串值,这样应该会更快,并且不会消耗那么多内存。
发布于 2011-09-21 15:04:23
有两种XML解析方法: 1)使用dom解析器;2)使用sax解析器。尝试使用dom解析器解析一个具有512BRAM的2 2GB文件肯定会导致内存不足异常,因此,使用sax解析器也会更快,因为你已经知道你在寻找什么。
https://stackoverflow.com/questions/7495708
复制相似问题