У меня есть файл размером 15 ГБ, который я бы хотел разбить. Он имеет около 300 миллионов строк. У него нет каких-либо верхних узлов, которые являются взаимозависимыми. Есть ли доступный инструмент, который легко делает это для меня?
Разделение XML большого файла
Ответ 1
Я думаю, вам придется разделить вручную, если вы не заинтересованы в его программном использовании. Вот пример, который делает это, хотя он не упоминает максимальный размер обработанных XML файлов. Когда вы делаете это вручную, возникает первая проблема - как открыть сам файл.
Я бы порекомендовал очень простой текстовый редактор - что-то вроде Vim. При работе с такими большими файлами всегда полезно отключать все формы подсветки синтаксиса и/или складывания.
Другие варианты, которые стоит учитывать:
-
EditPadPro - я никогда не пробовал это с этим размером, но если это что-то похожее на другие продукты JGSoft, он должен работать как легкий ветерок. Не забудьте отключить подсветку синтаксиса.
-
VEdit - я использовал это с файлами размером 1 ГБ, работает так, как будто это ничего не значит.
Ответ 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 и статью об этом здесь:
Ответ 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, и это не помешало все, убедитесь, что вы отключили функцию автоматического резервного копирования.