【问题标题】:XML Split of a Large file大文件的 XML 拆分
【发布时间】:2019-02-24 03:08:53
【问题描述】:

我有一个 15 GB 的 XML 文件,我想将其拆分。它有大约 3 亿行。它没有任何相互依赖的顶级节点。是否有任何可用的工具可以轻松为我做到这一点?

【问题讨论】:

    标签: xml


    【解决方案1】:

    XmlSplit - 一个分割大型 XML 文件的命令行工具

    xml_split - 将巨大的 XML 文档拆分成更小的块

    bhayanakmaut 拆分 XML (没有源代码,我无法让这个工作)

    类似问题:How do I split a large xml file?

    【讨论】:

    • 错误 #16 表示超过 1GB 文件的最大文件大小限制。它可以分割的最大尺寸是多少?
    【解决方案2】:

    QXMLEdit 有一个专门的功能:我成功地将它与维基百科转储一起使用。 ~2.7Gio 文件变成了一堆 ~1 400 000 个文件(每页一个)。它甚至允许您将它们分派到子文件夹中。

    【讨论】:

    • 我不知道你为什么被否决,这是一个非常有用的开源工具。
    • 这应该是公认的答案。非常有用的工具,开源,免费使用。
    • 一些额外的细节可能有助于投票。这是他们的教程:qxmledit.org/tutorials/splitFiles.pdf
    【解决方案3】:

    我认为除非您有兴趣以编程方式进行拆分,否则您将不得不手动拆分。 Here's a sample 这样做了,尽管它没有提到处理的 XML 文件的最大大小。手动进行时,首先出现的问题是如何打开文件本身。

    我会推荐一个非常简单的文本编辑器——比如Vim。在处理如此大的文件时,关闭所有形式的语法高亮和/或折叠总是有用的。

    其他值得考虑的选项:

    1. EditPadPro - 我从来没有用过这么大的东西,但如果它和其他 JGSoft 产品一样,它应该可以轻而易举地工作。记得关闭语法高亮。

    2. VEdit - 我已经将它用于 1GB 大小的文件,就像它什么都没有一样工作。

    3. EmEditor

    【讨论】:

    • 提供的链接中的示例是否进行标签检查?
    • 如果您询问 CodeProject 链接,我认为它会在每个拆分文件的开头和结尾插入根节点。
    • 不幸的是它在 750 MB 后崩溃了
    • 我可以保证 EmEditor 在编辑大文件方面的效率。好编辑,值得被人熟知;可惜免费版被放弃了。
    • 谢谢,@bobince。我自己没有机会使用它,但听说过它的有效性。
    【解决方案4】:

    这是一个低内存占用脚本,可在免费的 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 视频和文章:

    http://www.firstobject.com/xml-splitter-script-video.htm

    【讨论】:

      【解决方案5】:

      开源库逗号有几个工具可以在非常大的 XMl 文件中查找数据并将这些文件拆分为更小的文件。

      https://github.com/acfr/comma/wiki/XML-Utilities

      这些工具是使用 expat SAX 解析器构建的,因此它们不会使用 xmlstarlet 和 saxon 之类的 DOM 树来填充内存。

      【讨论】:

      • 这些对我来说在更小的文件(~1GB)上失败了。
      • xmlstarlet 和 saxon 对我们来说也失败了,所以这就是我将 xml 工具添加到逗号的原因。
      【解决方案6】:

      也许这个问题仍然存在,我相信它可以帮助某人。 有一个 xml 编辑器XiMpLe,其中包含一个用于拆分大文件的工具。只需要片段大小。并且还有将 xml 文件链接在一起的反向功能(!)。 它对非商业用途是免费的,而且许可证也不贵。 无需安装。对我来说效果很好(我有 5GB 文件)。

      【讨论】:

      • 很好,这个解决方案只对我 OTB 有效,而且工作量很小。谢谢。
      【解决方案7】:

      你需要以什么方式拆分它?使用XmlReader.ReadSubTree 编写代码非常容易。它将针对当前元素及其所有子元素返回一个新的 xmlReader 实例。因此,移动到根的第一个子节点,调用 ReadSubtree,写入所有这些节点,使用原始读取器调用 Read(),然后循环直到完成。

      【讨论】:

        【解决方案8】:
        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)
        

        【讨论】:

          【解决方案9】:

          我使用了 XmlSplit Wizard 工具。它真的很好用,您可以指定拆分方法,如元素、行、文件数或文件大小。唯一的问题是我必须以 99 美元的价格购买它,因为试用版不允许您拆分所有数据,只能拆分奇数个文件。我能够拆分一个 70GB 的文件!

          【讨论】:

            【解决方案10】:

            不是 Xml 工具,但 Ultraedit 可能会有所帮助,我已经将它用于 2G 文件,它一点也不介意,但请确保关闭自动备份功能。

            【讨论】:

            猜你喜欢
            • 2021-01-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-22
            相关资源
            最近更新 更多