大文件的XML拆分
我有一个15GB的XML文件,我想分割它,它有大约3亿行。它没有任何相互依赖的顶级节点。是否有任何工具可以随时为我做到这一点?不是Xml工具,但可能会有所帮助,我将其用于2G文件,它一点也不介意,但请确保关闭自动备份功能。我认为您必须手动拆分,除非您对以编程方式进行拆分感兴趣。这就做到了,尽管它没有提到处理过的XML文件的最大大小。手动操作时,出现的第一个问题是如何打开文件本身 我会推荐一个非常简单的文本编辑器,比如。在处理如此大的文件时,关闭所有形式的语法高亮显示和/或折叠总是很有用的 其他值得考虑的方案:大文件的XML拆分,xml,Xml,我有一个15GB的XML文件,我想分割它,它有大约3亿行。它没有任何相互依赖的顶级节点。是否有任何工具可以随时为我做到这一点?不是Xml工具,但可能会有所帮助,我将其用于2G文件,它一点也不介意,但请确保关闭自动备份功能。我认为您必须手动拆分,除非您对以编程方式进行拆分感兴趣。这就做到了,尽管它没有提到处理过的XML文件的最大大小。手动操作时,出现的第一个问题是如何打开文件本身 我会推荐一个非常简单的文本编辑器,比如。在处理如此大的文件时,关闭所有形式的语法高亮显示和/或折叠总是很有用的 其他值
下面是一个低内存占用脚本,可以在免费的firstobject XML编辑器(foxe)中使用CMarkup文件模式进行此操作。我不确定您所说的不相互依赖的顶级节点或标记检查是什么意思,但假设在根元素下有数百万顶级元素,其中包含对象属性或行,每个属性或行都需要作为一个单元保存在一起,并且您希望每个输出文件有一百万个,那么您可以这样做: split_xml_15GB() { int nObjectCount = 0, nFileCount = 0; CMarkup xmlInput, xmlOutput; xmlInput.Open( "15GB.xml", MDF_READFILE ); xmlInput.FindElem(); // root str sRootTag = xmlInput.GetTagName(); xmlInput.IntoElem(); while ( xmlInput.FindElem() ) { if ( nObjectCount == 0 ) { ++nFileCount; xmlOutput.Open( "piece" + nFileCount + ".xml", MDF_WRITEFILE ); xmlOutput.AddElem( sRootTag ); xmlOutput.IntoElem(); } xmlOutput.AddSubDoc( xmlInput.GetSubDoc() ); ++nObjectCount; if ( nObjectCount == 1000000 ) { xmlOutput.Close(); nObjectCount = 0; } } if ( nObjectCount ) xmlOutput.Close(); xmlInput.Close(); return nFileCount; } 拆分xml_15GB() { int nObjectCount=0,nFileCount=0; CMarkup xmlInput,xmlOutput; Open(“15GB.xml”,MDF_READFILE); xmlInput.FindElem();//根 str sRootTag=xmlInput.GetTagName(); xmlInput.intolem(); while(xmlInput.FindElem()) { 如果(nObjectCount==0) { ++恩菲雷克蒙特; xmlOutput.Open(“piece”+nFileCount+“.xml”,MDF_WRITEFILE); AddElem(sRootTag); xmlOutput.intolem(); } xmlOutput.AddSubDoc(xmlInput.GetSubDoc()); ++无对象计数; 如果(nObjectCount==1000000) { xmlOutput.Close(); nObjectCount=0; } } if(nObjectCount) xmlOutput.Close(); xmlInput.Close(); 返回nFileCount; } 我在youtube上发布了一段视频和一篇文章:
您需要以何种方式拆分它?使用
XmlReader.ReadSubTree
编写代码非常简单。它将针对当前元素及其所有子元素返回一个新的xmlReader实例。因此,移动到根目录的第一个子目录,调用ReadSubtree,编写所有这些节点,使用原始读取器调用Read(),并循环直到完成。xmlspit-一种分割大型XML文件的命令行工具
类似的问题:QXMLEdit有一个专门的功能:我在维基百科转储中成功地使用了它。~2.7Gio文件变成了一堆~1400000个文件(每页一个)。它甚至允许您将它们分配到子文件夹中。开源库comma有几种工具可以在非常大的XMl文件中查找数据,并将这些文件拆分为较小的文件 这些工具是使用expat-SAX解析器构建的,因此它们不会用xmlstarlet和saxon之类的DOM树来填充内存。
将其用于分割雅虎问答数据集
Used this for splitting Yahoo Q&A dataset
count = 0
file_count = 1
with open('filepath') as f:
current_file = ""
for line in f:
current_file = current_file + line
if "</your tag to split>" in line:
count = count + 1
if count==50000:
current_file = current_file + "</endTag>"
with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split:
split.write(current_file)
file_count = file_count + 1
current_file = "<?xml version='1.0' encoding='UTF-8'?>\n<endTag>"
count = 0
current_file = current_file + "</endTag>"
with open('filepath/Split/file_' +str(file_count)+'.xml' , 'w') as split:
split.write(current_file)
计数=0
文件计数=1
将open('filepath')作为f:
当前_文件=“”
对于f中的行:
当前文件=当前文件+行
如果行中有“”:
计数=计数+1
如果计数=50000:
当前文件=当前文件+“”
将open('filepath/Split/file_'+str(file_count)+'.xml、'w')作为拆分:
split.write(当前_文件)
文件计数=文件计数+1
当前\u文件=“\n”
计数=0
当前文件=当前文件+“”
将open('filepath/Split/file_'+str(file_count)+'.xml、'w')作为拆分:
split.write(当前_文件)
我使用了XmlSplit向导工具。它确实工作得很好,您可以指定拆分方法,如元素、行、文件数或文件大小。唯一的问题是我不得不花99美元买它,因为试用版不允许你分割所有数据,只允许分割奇数个文件。我能够分割一个70GB的文件 也许这个问题仍然是现实的,我相信它可以帮助一些人。
有一个xml编辑器,其中包含一个用于拆分大文件的工具。只需要片段大小。还有反向功能可以将xml文件链接在一起(!)。
非商业用途是免费的,许可证也不贵。
不需要安装。对我来说,它工作得非常好(我有5GB的文件)。提供的链接中的示例是否进行标记检查?如果你问的是CodeProject链接,我认为它会在每个分割文件的开头和结尾插入根节点。不幸的是,它在750Mbi后崩溃,这可以证明EmEditor编辑大型文件的效率。好的编辑,值得更多的了解;可惜免费版本被删除了。谢谢,@bobince。我自己没有机会使用它,但听说过它的有效性。错误#16说1GB文件超过了最大文件大小限制。它可以拆分的最大大小是多少?这些对我来说在更小的文件(~1GB)上失败了。xmlstarlet和saxon对我们来说也失败了,所以这就是为什么我在逗号中添加了xml工具。我在链接项中添加了一个解决方案。下面是关于如何使用UE拆分大文件的说明,我不知道您为什么被否决,这是一个非常有用的解决方案,开源工具。这应该是公认的答案。非常有用的工具,开源,免费使用。一些额外的细节可能有助于投票。这是t