对于某些丧心病狂提供了上百兆 XML 文件的 API 要怎么破?

2014-07-21 15:18:34 +08:00
 andybest
例如: http://www.meituan.com/api/v2/beijing/deals (只是例子,有比这个大很多的)

每次读取服务器妥妥 OutOfMemoryError,除了分配给服务器更多的可用内存(土豪就没这个问题了)
在服务器可用内存低于这个 XML 文件大小时,如何正常处理这个 API ?
4037 次点击
所在节点    问与答
26 条回复
Livid
2014-07-21 15:31:07 +08:00
没有提供分页参数么?
izoabr
2014-07-21 15:42:01 +08:00
@julyclyde 你觉得这个问题怎么办?
yorkw
2014-07-21 15:47:13 +08:00
tabris17
2014-07-21 15:50:21 +08:00
自己写一个XMLParser
keithellis
2014-07-21 16:03:45 +08:00
SAX parser
feiyuanqiu
2014-07-21 16:08:31 +08:00
PHP的话,可以用XMLReader这个扩展,它是按照文件流的方式每次按照节点来读取,读完一个节点再读下一个,不会把文件整个载入内存,php5.1以上都是自带了的,直接可以用。
andybest
2014-07-21 16:20:19 +08:00
@keithellis SAX (Simple API for XML) parser 不是在初始化的时候一次将XML全部装入内存的吗?如何能解决这个问题呢?
chmlai
2014-07-21 16:22:29 +08:00
@andybest SAX 不需要, DOM 才是
andybest
2014-07-21 16:25:40 +08:00
@chmlai 谢谢,SAX 是 streaming 的读取模式吗?
keithellis
2014-07-21 16:26:13 +08:00
bigredapple
2014-07-21 16:28:39 +08:00
SAX
andybest
2014-07-21 16:28:52 +08:00
@keithellis Very useful !收藏了,十分感谢!
kaneg
2014-07-21 16:32:08 +08:00
如果你使用Java,基于事件的流式处理方式应该更适合你。示例代码:
try {
URL url = new URL("http://www.meituan.com/api/v2/beijing/deals");
URLConnection connection = url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(60000);
InputStream is = connection.getInputStream();
try {
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLEventReader xmlEventReader = factory.createXMLEventReader(new BufferedInputStream(is));
while (xmlEventReader.hasNext()) {
XMLEvent xmlEvent = xmlEventReader.nextEvent();

if (xmlEvent.isStartElement()) {
StartElement startElement = xmlEvent.asStartElement();
System.out.println(startElement.getName().getLocalPart());
}
}
} catch (Exception e) {
System.err.println(e.getMessage());
}
} catch (IOException e) {
System.err.println(e.getMessage());
}
xujialiang
2014-07-21 16:46:29 +08:00
IOS中,document方式会一次把xml全部读进内存的。
Zhang
2014-07-21 16:52:25 +08:00
加载完了,浏览器耗了4.42GB内存
andybest
2014-07-21 16:53:56 +08:00
@Zhang 用什么方式加载的?
fanghui
2014-07-21 17:17:07 +08:00
笨方法:下载--保存文件--分文件--解析文件---
Zhang
2014-07-21 17:22:31 +08:00
@andybest safari呀
ChiChou
2014-07-21 17:47:54 +08:00
@fanghui 分文件就破坏了 XML 的合法性。
ChiChou
2014-07-21 17:48:04 +08:00
pull 比较适合这个场景。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/123745

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX