2010-03-19 53 views
2

我在具有以下要求的应用程序的工作处理XML文件 -与庞大的数据

  1. 从服务器下载一个ZIP文件。
  2. 解压缩ZIP文件,从该文件获取内容(XML格式)为字符串。
  3. 将此内容传递给另一个解析和进一步处理的方法。

现在,我的关注点是XML文件的大小可以说是'100MB',而我的JVM只有512 MB的内存,所以我怎样才能将这些内容加入到块中并传递给Parsing和然后将数据插入到PL/SQL表中。

由于可以同时运行多个请求并考虑512MB内存,因此最好能够处理该请求。

如何将数据获取到Chunks中并将其作为Stream传递给XML解析。

+0

dupe of http://stackoverflow.com/questions/504689/big-xml-file-and-outofmemoryerror http://stackoverflow.com/questions/1913551/huge-xml-file-do-i-read-一个页面和每个进程处理它http://stackoverflow.com/questions/23106/best-method-to-parse-various-custom-xml-documents-in-java http:// stackoverflow。 com/search?q = huge + xml + java – voyager 2010-03-19 21:30:01

+0

另请参阅:http://stackoverflow.com/questions/1134189/can-jaxb-parse-large-xml-files-in-chunks – Ash 2010-03-19 21:31:40

+0

另请参阅http:// stackoverflow .com/questions/2013996/large-xml-files-and-pagination-is-it-possible – 2010-03-19 22:47:24

回答

3

任何SAX解析器都应该工作,因为它不会像DOM解析器一样将整个XML文件加载到内存中。

5

Java's XMLReader是一个SAX2解析器。在DOM解析器读取整个XML文件并创建(通常是大型)数据结构(通常是树)来表示其内容的情况下,SAX解析器可让您注册一个处理程序,该程序将在XML文档的部分认可。在该回调代码中,您只能保存足够的数据来执行所需的操作 - 例如您可能会保存所有将以数据库中的单行结束的字段,插入该行并丢弃数据。使用这种类型的设计,程序的内存消耗量取决于文件大小,而不是单个逻辑数据项的复杂性和大小(在您的情况下,数据将成为数据库中的一行)。

即使您确实使用了DOM风格的解析器,事情可能并不像您期望的那么糟糕。 XML非常详细,所以(取决于它的结构和方式)一个100 MB的文件通常只代表10-20 MB的数据,而低至5 MB的数据不会特别少见或难以置信。

+0

感谢您的回复。 但我的主要要求是我不想将所有数据加载到内存中,而是必须读取Chunks中的一小部分XML文件,并将它传递给其他某个应用程序进行处理以避免内存不足错误.... – 2010-03-19 21:43:41

+1

@Manish:这就是为什么我(以及其他给你答复的人)推荐使用SAX风格的解析器 - 它从不试图将整个文件加载到内存中。 – 2010-03-19 22:03:45

+0

嗨杰里, 其实在我的要求中,我必须从服务器下载文件并将XML数据转换为字符串,这个字符串我必须传递给解析XML的其他应用程序。 我可以有一些机制,在从服务器下载文件的过程中,我可以将这些数据块传递给其他应用程序? – 2010-03-19 23:54:07