【发布时间】:2011-01-30 05:19:11
【问题描述】:
我有一个大型的维基百科转储,我想将它切割成不同的文件(每篇文章 1 个文件)。我写了一个 VB 应用程序来为我做这件事,但它很慢,经过几个小时的剪辑后就崩溃了。我目前使用另一个应用程序将文件分成更小的 50mb 块,但这需要很长时间(每个块 20-30 分钟)。如果我这样做,我应该能够单独切割每一个。
有没有人对如何更快地剪切这个文件有任何建议?
【问题讨论】:
我有一个大型的维基百科转储,我想将它切割成不同的文件(每篇文章 1 个文件)。我写了一个 VB 应用程序来为我做这件事,但它很慢,经过几个小时的剪辑后就崩溃了。我目前使用另一个应用程序将文件分成更小的 50mb 块,但这需要很长时间(每个块 20-30 分钟)。如果我这样做,我应该能够单独切割每一个。
有没有人对如何更快地剪切这个文件有任何建议?
【问题讨论】:
使用 C# 执行此操作的最简单方法是使用 XmlReader。您可以单独使用 XmlReader 以获得最快的实现,也可以结合新的 LINQ XNode 类以获得性能和易用性的良好组合。有关示例,请参阅此 MSDN 文章:http://msdn.microsoft.com/en-us/library/system.xml.linq.xnode.readfrom.aspx。
您应该能够将示例修改为一次仅将一个文档的节点保存在内存中,然后将其作为文件写回。它应该表现良好并且适用于非常大的文件。
【讨论】:
我假设您正在使用 DOM 解析器。对于可能较大的文件,您应该始终使用SAX 解析器。 DOM 解析器将整个文件读入内存,而 SAX 解析器一次读取尽可能少,因此运行效率更高。 This tutorial 描述了如何编写 C# SAX 解析器,VB 应该很相似。
【讨论】:
如果我在 Java 中执行此操作,我会使用 javax.xml.stream.XMLEventReader 和 javax.xml.stream.XMLEventWriter。
在某种伪代码中,假设<article> 标签分隔每篇维基百科文章,您无需担心嵌套的<article> 标签,并且您有一个openNewWriter() 函数来打开一个新的@987654328 @ 写入具有适合本文名称的新文件。
然后我的代码看起来像这样:
XMLEventReader r = // an XMLEventReader for the original wikipedia dump
XMLEventWriter w = null;
bool isInsideArticle = false;
while (r.hasNext()){
XMLEvent e = r.nextEvent();
if (e.isStartElement() &&
e.asStartElement().getName().getLocalPart().equals("article")){
w = openNewWriter();
// write the stuff that belongs outside the <article> tag
// by synthesizing XMLEvents and using w.add() to add them
w.add(e);
isInsideArticle = true;
} else if (e.isEndElement() &&
e.asEndElement().getName().getLocalPart().equals("article")) {
w.add(e);
// write the stuff that belongs outside the <article> tag
// by synthesizing XMLEvents and using w.add() to add them
isInsideArticle = false;
w.close();
} else if (isInsideArticle) {
w.add(e);
} else {
// this tag gets dropped on the floor because it's not inside any article
}
}
现在您需要做的就是在 .NET 中找到流式 XML 类。我认为它们是 system.xml.XMLReader 和 system.xml.XMLWriter,但我的专长不在 .NET 中,而且我无法从文档中判断它们是否会与我刚刚给你的 Java 版本完全相同。
(我在这里的目的更多是向您展示如何解决问题,而不是告诉您您需要的类的名称。)
【讨论】:
您应该为此尝试 vtd-xml,有人告诉我们它在拆分大型 XML 文件时效果如何...http://www.codeproject.com/KB/XML/xml_processing_future.aspx 我们还被告知 DOM 需要永远
【讨论】: