2009-03-31 42 views
10

Tengo un archivo XML de 15 GB que me gustaría dividir. Tiene aproximadamente 300 millones de líneas. No tiene ningún nodo superior que sea interdependiente. ¿Hay alguna herramienta disponible que haga esto fácilmente por mí?División XML de un archivo grande

+0

¿miró a vtd-xml para eso? –

Respuesta

3

Creo que tendrá que dividir manualmente a menos que esté interesado en hacerlo mediante programación. Here's a sample que hace eso, aunque no menciona el tamaño máximo de los archivos XML manejados. Al hacerlo manualmente, el primer problema que surge es cómo abrir el archivo.

Recomendaría un editor de texto muy simple, algo así como Vim. Al manejar archivos tan grandes, siempre es útil desactivar todas las formas de resaltado de sintaxis y/o plegado.

Otras opciones vale la pena considerar:

  1. EditPadPro - Nunca lo he probado con nada de este tamaño, pero si es algo como otros productos JGsoft, debería funcionar como una brisa. Recuerde apagar el resaltado de sintaxis.

  2. VEdit - Lo he usado con archivos de 1GB de tamaño, funciona como si no fuera nada en absoluto.

  3. EmEditor

+0

¿La muestra en el enlace provisto revisa las etiquetas? –

+0

Si está preguntando sobre el enlace CodeProject, creo que inserta nodos Root al principio y al final de cada archivo dividido. – Cerebrus

+0

Lamentablemente se ha bloqueado después de 750 MB –

-1

No es una herramienta Xml, pero Ultraedit probablemente podría ayudar, lo he usado con archivos 2G y no me importó en absoluto, pero asegúrese de desactivar la función de copia de seguridad automática.

+0

Necesito dividirlo –

+0

He agregado una solución al elemento vinculado http://stackoverflow.com/questions/4325823/how-do-i-split-a-large-xml-file/ –

+0

Aquí están las instrucciones de cómo usar UE para dividir un archivo grande http://www.ultraedit.com/support/tutorials_power_tips/ultraedit/split-large-files.html – MrTelly

3

Aquí es una secuencia de comandos de bajo consumo de memoria para hacerlo en el editor XML firstObject libre (foxe) utilizando el modo de archivo CMarkup. No estoy seguro de lo que quiere decir con nodos superiores interdependientes, o control de etiquetas, pero suponiendo que bajo el elemento raíz tiene millones de elementos de nivel superior que contienen propiedades o filas de objetos que cada uno necesita mantenerse juntos como una unidad, y quería decir 1 millón por archivo de salida, usted puede hacer esto:

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

me ha enviado el vídeo de YouTube y el artículo sobre esto aquí:

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

0

¿de qué manera es lo que necesita dividirlo? Es bastante fácil escribir código usando XmlReader.ReadSubTree. Devolverá una nueva instancia de xmlReader contra el elemento actual y todos sus elementos secundarios. Por lo tanto, vaya al primer hijo de la raíz, llame a ReadSubtree, escriba todos esos nodos, llame a Read() usando el lector original y bucle hasta que finalice.

7

XmlSplit - Una herramienta de línea de comandos que divide grandes archivos XML

xml_split - divide grandes documentos XML en trozos más pequeños

escisión que XML Bhayanak Maut (Sin código fuente y no pude conseguir éste trabajo)

Una pregunta similar: How do I split a large xml file?

+0

Error # 16 que indica que se ha excedido el límite máximo de tamaño de archivo para 1 GB. ¿Cuál es el tamaño máximo que puede dividir? –

0

QXMLEdit tiene un dedicado función para eso: lo utilicé con éxito con un volcado de Wikipedia. El archivo ~ 2.7Gio se convirtió en un grupo de ~ 1 400 000 archivos (uno por página). Incluso le permite enviarlos en subcarpetas.

+0

No sé por qué estabas abajo, esta es una herramienta de código abierto muy útil. – jeffmcneill

0

La coma de la biblioteca de código abierto tiene varias herramientas para buscar datos en archivos XMl muy grandes y para dividir esos archivos en archivos más pequeños.

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

Las herramientas se construyeron usando el analizador SAX expatriados por lo que no llenan la memoria con un árbol DOM como xmlstarlet y Saxon.

+0

me fallan en archivos mucho más pequeños (~ 1GB). – blueberryfields

+0

xmlstarlet y saxon fallaron para nosotros también, por eso agregué las herramientas xml a la coma. –

0
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) 
Cuestiones relacionadas