Разделение XML большого файла

У меня есть файл размером 15 ГБ, который я бы хотел разбить. Он имеет около 300 миллионов строк. У него нет каких-либо верхних узлов, которые являются взаимозависимыми. Есть ли доступный инструмент, который легко делает это для меня?

Ответ 1

Я думаю, вам придется разделить вручную, если вы не заинтересованы в его программном использовании. Вот пример, который делает это, хотя он не упоминает максимальный размер обработанных XML файлов. Когда вы делаете это вручную, возникает первая проблема - как открыть сам файл.

Я бы порекомендовал очень простой текстовый редактор - что-то вроде Vim. При работе с такими большими файлами всегда полезно отключать все формы подсветки синтаксиса и/или складывания.

Другие варианты, которые стоит учитывать:

  • EditPadPro - я никогда не пробовал это с этим размером, но если это что-то похожее на другие продукты JGSoft, он должен работать как легкий ветерок. Не забудьте отключить подсветку синтаксиса.

  • VEdit - я использовал это с файлами размером 1 ГБ, работает так, как будто это ничего не значит.

  • EmEditor

Ответ 2

XmlSplit - инструмент командной строки, который разделяет большие файлы XML

xml_split - разбивает огромные документы XML на более мелкие куски

Разделить этот XML на bhayanakmaut (Нет исходного кода, и я не мог заставить его работать)

Аналогичный вопрос: Как разбить большой XML файл?

Ответ 3

Ниже представлен небольшой размер памяти script, чтобы сделать это в бесплатном XML-редакторе firstobject (foxe), используя режим файла CMarkup. Я не уверен, что вы подразумеваете под разными взаимозависимыми верхними узлами или проверкой тегов, но при условии, что в корневом элементе у вас есть миллионы элементов верхнего уровня, содержащих свойства или строки объектов, которые каждый должен храниться вместе как единое целое, и вы хотели сказать 1 миллион на выходной файл, вы можете сделать это:

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;
}

Я разместил видео с youtube и статью об этом здесь:

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

Ответ 4

Каким образом вам нужно разбить его? Это довольно легко написать код, используя XmlReader.ReadSubTree. Он вернет новый экземпляр xmlReader против текущего элемента и всех его дочерних элементов. Итак, перейдите к первому потомку корня, вызовите ReadSubtree, напишите все эти узлы, вызовите Read() с помощью оригинального считывателя и завершите цикл до конца.

Ответ 5

QXMLEdit имеет специальную функцию для этого: я использовал его успешно с дамп Википедии. Файл ~ 2.7Gio стал связью ~ 1 400 000 файлов (по одной на страницу). Он даже позволяет отправлять их в подпапках.

Ответ 6

В библиотеке с открытым исходным кодом есть несколько инструментов для поиска данных в очень больших файлах XMl и для разделения этих файлов на более мелкие файлы.

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

Инструменты были созданы с использованием синтаксического анализатора expat SAX, чтобы они не заполняли память деревом DOM, например xmlstarlet и saxon.

Ответ 7

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)

Ответ 8

Не инструмент Xml, но Ultraedit, возможно, поможет, я использовал его с файлами 2G, и это не помешало все, убедитесь, что вы отключили функцию автоматического резервного копирования.