XML Split большого файла - PullRequest
14 голосов
/ 31 марта 2009

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

Ответы [ 10 ]

9 голосов
/ 19 октября 2011

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

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

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

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

4 голосов
/ 12 февраля 2014

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

3 голосов
/ 19 июня 2009

Вот сценарий с низким объемом занимаемой памяти, чтобы сделать это в бесплатном 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

3 голосов
/ 31 марта 2009

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

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

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

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

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

  3. EmEditor

1 голос
/ 08 сентября 2014

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

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

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

0 голосов
/ 23 февраля 2019

Возможно, этот вопрос все еще актуален, и я верю, что он может кому-то помочь. Существует XML-редактор XiMpLe , который содержит инструмент для разделения больших файлов. Требуется только размер фрагмента. И есть также обратная функциональность, чтобы связать XML-файлы вместе (!). Это бесплатно для некоммерческого использования, и лицензия также не дорогая. Установка не требуется. Для меня это работало очень хорошо (у меня был файл 5 ГБ).

0 голосов
/ 18 ноября 2018

Я использовал инструмент XmlSplit Wizard. Это действительно хорошо работает, и вы можете указать метод split, такой как элемент, строки, количество файлов или размер файлов. Единственная проблема заключается в том, что мне пришлось купить его за 99 $, так как пробная версия не позволит вам разделить все данные, только нечетное количество разделенных файлов. Мне удалось разделить файл размером 70 ГБ!

0 голосов
/ 27 апреля 2017
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 голосов
/ 19 июня 2009

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

0 голосов
/ 31 марта 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...