java - 在 Java 中使用多线程解析 XML
问题描述
我使用 JAXB 在 java 中读取大约 4 GB 的大型 XML,我有一个带有 SSD、RAM 和多个 CPU 内核的良好系统。我想使用多个线程读取该 XML 文件。我已经研究过了,但还没有找到任何解决方案。
我在想,如果我可以使用多个线程读取 XML 并发送字节块以通过 XML 解析器进行解析,那会很好,但想知道是否已经有了实现的解决方案。
我的代码片段是
public void parseXML() throws Exception{
try(InputStream is = new BufferedInputStream(new FileInputStream(xmlFile),XML_READ_BUFFER)){
//try(InputStream is = new ByteArrayInputStream(removeAnd.getBytes(StandardCharsets.UTF_16))){
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader sr = xmlif.createXMLStreamReader(is);
JAXBContext ctx = JAXBContext.newInstance(XwaysImage.class);
Unmarshaller unmar = ctx.createUnmarshaller();
int c=0;
while (sr.hasNext()){
while(this.pause.get())Thread.sleep(100);
if(this.cancel.get()) break;
int eventType = sr.next();
if(eventType == XMLStreamConstants.START_ELEMENT){
if("ImageFile".equals(sr.getName().getLocalPart())){
XwaysImage xim = unmar.unmarshal(sr,XwaysImage.class).getValue();
//TODO code here.
}
}
}
sr.close();
is.close();
}catch(Exception e){
log.error("",e);
}
}
解决方案
不确定我是否完全理解您需要并发的代码部分,但如果是您的 while 循环,您可以尝试:
sr.parallelStream().forEach(-> {
//do something
})
推荐阅读
- node.js - 在nodejs中使用加密签署pdf文档
- swift - 使用 Xcode - 安装自定义字体以供 mac 中的所有应用程序使用
- aggregation - 如何在自定义 Presto 聚合函数中强制执行排序 (ORDER BY)
- javascript - 从不同颜色的句子中显示一个 json 单词
- c# - 当我尝试每 10 秒在屏幕上显示文本时,它永远不会工作
- python - 我的 CSV 文件正确显示数据,但每行之间有空行
- html - 当我必须排除导航栏时如何使 div 显示高度的 100%
- video - 如何根据 FFMpeg 编码命令或输出确定 AV1 文件的正确 HTML5 视频编解码器属性?
- python - ffmpeg 使用 python 将专辑封面艺术添加到 mp3
- apache - .htaccess - www 到非 www & http 到 https & 包括斜杠