我正在处理维基百科的垃圾。尤其是文件-enwiki-latest-pages-articles-multistream.xml.bz2。这是大约46gb未压缩。我目前正在使用java(xerces)中的stax解析器,能够每秒提取15k个页面元素。然而,瓶颈似乎是解析器,我曾玩弄过aalto-xml,但它没有帮助。
因为我正在分析storm spout中的每个页面元素,所以这是一个瓶颈。然而,我想我可以简单地发出文本之间。。。标记并有几个螺栓并行处理这些页面元素中的每一个。这将减少雨水口必须执行的工作量。然而,我不确定在这里采取的具体方法。如果我使用解析器来提取标签之间的内容,那就意味着它将从标签的开始到结束解析每个元素。有没有办法消除标准sax/stax解析器中的这种开销?
2条答案
按热度按时间dojqjjoe1#
没有办法对xml文档进行随机访问,但是许多javaxml解析器跳过未使用的内容的效率更高:例如aalto和woodstox延迟了字符串值的解码(以及
String
对象),因此如果跳过令牌,则不需要分配。有一件事要确保与斯塔克斯是不使用
Event
api,除非有缓冲内容的特殊需要——它不提供比基本流式api更多的功能(XMLStreamReader
),但由于XMLEvent
无论是否需要,它都是构造的。另一方面,流式api只指示事件/令牌的类型,让调用者决定是否需要内容(属性、文本值),并且可以避免大多数对象分配。yrdbyhpb2#
我也试过类似的方法来并行化。
不管怎样,由于我在很多任务中使用wikipedia数据,只需生成一篇文章就可以了,这样我就可以并行运行许多实验了。它只需要几分钟运行,然后我有一个转储,我可以饲料Spark(在你的情况下风暴)非常容易。
如果您想使用我们的工具,请检查:https://github.com/idio/wiki2vec