2009-03-31 11 views
10

J'ai un fichier XML de 15 Go que je voudrais diviser. Il contient environ 300 millions de lignes. Il n'y a pas de nœuds supérieurs qui sont interdépendants. Y a-t-il un outil disponible qui le fait facilement pour moi?Partage XML d'un fichier volumineux

+0

avez-vous regardé vtd-xml pour cela? –

Répondre

3

Je pense que vous devrez diviser manuellement sauf si vous êtes intéressé à le faire par programmation. Here's a sample qui fait cela, bien qu'il ne mentionne pas la taille maximale des fichiers XML gérés. Lorsque vous le faites manuellement, le premier problème qui se pose est de savoir comment ouvrir le fichier lui-même.

Je recommanderais un éditeur de texte très simple - quelque chose comme Vim. Lorsque vous manipulez de tels fichiers volumineux, il est toujours utile de désactiver toutes les formes de coloration syntaxique et/ou de pliage.

Autres options: utile d'envisager

  1. EditPadPro - Je l'ai jamais essayé avec quoi que ce soit cette taille, mais si elle est quelque chose comme d'autres produits JGsoft, il devrait fonctionner comme un jeu d'enfant. N'oubliez pas de désactiver la coloration syntaxique.

  2. VEdit - Je l'ai utilisé avec des fichiers de 1 Go, fonctionne comme si ce n'était rien du tout.

  3. EmEditor

+0

Est-ce que l'exemple du lien fourni permet de vérifier les tags? –

+0

Si vous posez des questions sur le lien CodeProject, je pense qu'il insère des nœuds racines au début et à la fin de chaque fichier partagé. – Cerebrus

+0

Malheureusement, il s'est écrasé après 750 Mo –

-1

Pas un outil Xml mais Ultraedit pourrait probablement aider, je l'ai utilisé avec des fichiers 2G et cela ne dérangeait pas du tout, assurez-vous de désactiver la fonctionnalité de sauvegarde automatique cependant.

+0

Je dois le diviser –

+0

J'ai ajouté une solution sur l'élément lié http://stackoverflow.com/questions/4325823/how-do-i-plplit-a-large-xml-file/ –

+0

Voici les instructions sur comment utiliser UE pour diviser un fichier volumineux http://www.ultraedit.com/support/tutorials_power_tips/ultraedit/split-large-files.html – MrTelly

3

est ici un faible script empreinte mémoire de le faire dans l'éditeur XML firstobject gratuit (Foxe) en utilisant le mode de fichier CMarkup. Je ne suis pas sûr de ce que vous voulez dire par aucun nœud supérieur interdépendant, ou vérification de balise, mais en supposant que sous l'élément racine vous avez des millions d'éléments de haut niveau contenant des propriétés d'objet ou des lignes qui doivent être conservées ensemble. 1 million par fichier de sortie, vous pouvez le faire:

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

J'ai posté une vidéo sur youtube et article à ce sujet ici:

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

0

de quelle façon avez-vous besoin de le diviser? Il est assez facile d'écrire du code en utilisant XmlReader.ReadSubTree. Il retournera une nouvelle instance de xmlReader par rapport à l'élément en cours et à tous ses éléments enfants. Donc, déplacez-vous au premier enfant de la racine, appelez ReadSubtree, écrivez tous ces nœuds, appelez Read() en utilisant le lecteur d'origine et bouclez jusqu'à ce que vous ayez fini.

7

XmlSplit - Un outil de ligne de commande qui divise Grande fichiers XML

xml_split - split énormes documents XML en petits morceaux

de Split que XML par bhayanakmaut (pas de code source et je ne pouvais pas obtenir celui de travail)

Une question similaire: How do I split a large xml file?

+0

Erreur # 16 indiquant la limite de taille de fichier maximale dépassée pour le fichier de 1 Go. Quelle est la taille maximale qu'il peut diviser? –

0

QXMLEdit a dédié Fonction pour cela: Je l'ai utilisé avec succès avec un vidage Wikipédia. Le fichier ~ 2.7Gio est devenu un tas de ~ 1 400 000 fichiers (un par page). Il vous permet même de les envoyer dans des sous-dossiers.

+0

Je ne sais pas pourquoi vous avez été downvoted, c'est un outil très utile, open source. – jeffmcneill

0

La virgule de la bibliothèque open source dispose de plusieurs outils pour rechercher des données dans de très gros fichiers XMl et pour les diviser en fichiers plus petits.

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

Les outils ont été construits en utilisant l'analyseur SAX expatriés afin qu'ils ne remplissent la mémoire avec un arbre DOM comme xmlstarlet et Saxonne.

+0

ceux-ci échouent pour moi sur des fichiers beaucoup plus petits (~ 1 Go). – blueberryfields

+0

xmlstarlet et saxon ont échoué pour nous aussi c'est pourquoi j'ai ajouté les outils xml à la virgule. –

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)