【发布时间】:2019-02-24 03:08:53
【问题描述】:
我有一个 15 GB 的 XML 文件,我想将其拆分。它有大约 3 亿行。它没有任何相互依赖的顶级节点。是否有任何可用的工具可以轻松为我做到这一点?
【问题讨论】:
标签: xml
我有一个 15 GB 的 XML 文件,我想将其拆分。它有大约 3 亿行。它没有任何相互依赖的顶级节点。是否有任何可用的工具可以轻松为我做到这一点?
【问题讨论】:
标签: xml
XmlSplit - 一个分割大型 XML 文件的命令行工具
xml_split - 将巨大的 XML 文档拆分成更小的块
bhayanakmaut 拆分 XML (没有源代码,我无法让这个工作)
【讨论】:
QXMLEdit 有一个专门的功能:我成功地将它与维基百科转储一起使用。 ~2.7Gio 文件变成了一堆 ~1 400 000 个文件(每页一个)。它甚至允许您将它们分派到子文件夹中。
【讨论】:
我认为除非您有兴趣以编程方式进行拆分,否则您将不得不手动拆分。 Here's a sample 这样做了,尽管它没有提到处理的 XML 文件的最大大小。手动进行时,首先出现的问题是如何打开文件本身。
我会推荐一个非常简单的文本编辑器——比如Vim。在处理如此大的文件时,关闭所有形式的语法高亮和/或折叠总是有用的。
其他值得考虑的选项:
EditPadPro - 我从来没有用过这么大的东西,但如果它和其他 JGSoft 产品一样,它应该可以轻而易举地工作。记得关闭语法高亮。
VEdit - 我已经将它用于 1GB 大小的文件,就像它什么都没有一样工作。
【讨论】:
这是一个低内存占用脚本,可在免费的 firstobject XML 编辑器 (foxe) 中使用 CMarkup 文件模式执行此操作。我不确定你所说的没有相互依赖的顶级节点或标签检查是什么意思,但假设在根元素下你有数百万个包含对象属性或行的顶级元素,每个元素都需要作为一个单元保存在一起,你想说每个输出文件 100 万,您可以这样做:
split_xml_15GB()
{
int nObjectCount = 0, nFileCount = 0;
CMarkup xmlInput、xmlOutput;
xmlInput.Open("15GB.xml", MDF_READFILE);
xmlInput.FindElem(); // 根
str sRootTag = xmlInput.GetTagName();
xmlInput.IntoElem();
而 ( xmlInput.FindElem() )
{
如果(nObjectCount == 0)
{
++n文件计数;
xmlOutput.Open("piece" + nFileCount + ".xml", MDF_WRITEFILE );
xmlOutput.AddElem(sRootTag);
xmlOutput.IntoElem();
}
xmlOutput.AddSubDoc(xmlInput.GetSubDoc());
++n对象计数;
如果(nObjectCount == 1000000)
{
xmlOutput.Close();
nObjectCount = 0;
}
}
如果(nObjectCount)
xmlOutput.Close();
xmlInput.Close();
返回 nFileCount;
}
我在这里发布了一个 youtube 视频和文章:
【讨论】:
开源库逗号有几个工具可以在非常大的 XMl 文件中查找数据并将这些文件拆分为更小的文件。
https://github.com/acfr/comma/wiki/XML-Utilities
这些工具是使用 expat SAX 解析器构建的,因此它们不会使用 xmlstarlet 和 saxon 之类的 DOM 树来填充内存。
【讨论】:
也许这个问题仍然存在,我相信它可以帮助某人。 有一个 xml 编辑器XiMpLe,其中包含一个用于拆分大文件的工具。只需要片段大小。并且还有将 xml 文件链接在一起的反向功能(!)。 它对非商业用途是免费的,而且许可证也不贵。 无需安装。对我来说效果很好(我有 5GB 文件)。
【讨论】:
你需要以什么方式拆分它?使用XmlReader.ReadSubTree 编写代码非常容易。它将针对当前元素及其所有子元素返回一个新的 xmlReader 实例。因此,移动到根的第一个子节点,调用 ReadSubtree,写入所有这些节点,使用原始读取器调用 Read(),然后循环直到完成。
【讨论】:
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)
【讨论】:
我使用了 XmlSplit Wizard 工具。它真的很好用,您可以指定拆分方法,如元素、行、文件数或文件大小。唯一的问题是我必须以 99 美元的价格购买它,因为试用版不允许您拆分所有数据,只能拆分奇数个文件。我能够拆分一个 70GB 的文件!
【讨论】:
不是 Xml 工具,但 Ultraedit 可能会有所帮助,我已经将它用于 2G 文件,它一点也不介意,但请确保关闭自动备份功能。
【讨论】: