2009-04-16 9 views
2

J'ai un fichier XML de taille 31 Go. J'ai besoin de trouver le nombre total de lignes dans ce fichier. Je sais que la commande wc -l me donnera la même chose. Cependant, cela prend trop de temps pour effectuer cette opération. Existe-t-il un mécanisme plus rapide pour trouver le nombre de lignes dans un fichier volumineux?Longueur d'un fichier XML

+0

@Turing complet: Il est pas nécessairement la faute de l'OP, peut-être qu'il travaille sur un système existant ou quelque chose de similaire. La question est valide et ne mérite pas un -1 – marcgg

Répondre

6

31 concerts est un très gros fichier texte. Je parie que cela compresserait jusqu'à environ 1,5 concerts. Je voudrais créer ces fichiers dans un format compressé pour commencer, puis vous pouvez diffuser une version décompressée du fichier via wc. Cela réduira considérablement la quantité d'E/S et de mémoire utilisée pour traiter ce fichier. gzip peut lire et écrire des flux compressés.

Mais je voudrais aussi faire les commentaires suivants:

  • Les numéros de ligne ne sont pas vraiment d'information pour XML comme des espaces entre les éléments est ignoré (sauf pour le contenu mixte). Que voulez-vous vraiment savoir sur l'ensemble de données? Je parie que compter les éléments serait plus utile.
  • Assurez-vous que votre fichier xml n'est pas redondant inutilement, par exemple répétez-vous les mêmes déclarations d'espace de noms partout dans le document?
  • Peut-être que XML est pas la meilleure façon de représenter ce document, si elle est essayer de regarder en quelque chose comme Fast Infoset
+0

Bonne idée sur les flux gzippés. Je serais curieux de voir l'impact sur les performances (je n'ai pas de fichier XML 31Go avec lequel jouer) –

4

Si tout ce dont vous avez besoin est le nombre de lignes, wc -l sera aussi rapide que toute autre chose.

Le problème est le fichier texte de 31 Go.

1

Non, pas vraiment. wc va être très bien optimisé. 31GB est beaucoup de données, et le lire pour compter les lignes va prendre un certain temps, peu importe le programme que vous utilisez.

En outre, cette question n'est pas vraiment appropriée pour Stack Overflow, car il ne s'agit pas de programmation du tout.

+0

Vous pouvez toujours avoir une solution de programmation –

3

Si la précision n'est pas un problème, recherchez la longueur de ligne moyenne et divisez la taille du fichier par cela. De cette façon, vous pouvez obtenir une approximation très rapide. (Assurez-vous de prendre en compte le codage de caractères utilisé)

+0

Comment trouvez-vous la longueur de ligne moyenne sans lire le fichier entier? – harto

+0

Je pensais juste à une supposition qualifiée ou peut-être faire une analyse statique une fois et utiliser cette valeur. – sris

+0

@harto Echantillonnez le fichier à différents décalages et extrapolez. –

2

Ceci est au-delà du point où le code devrait être refactorisé pour éviter complètement votre problème. Une façon de faire est de placer toutes les données dans le fichier dans une base de données de magasin de tuple à la place. Apache couchDB et Intersystems Cache sont deux systèmes que vous pouvez utiliser pour cela, et qui seront bien mieux optimisés pour le type de données que vous traitez.

Si vous êtes vraiment bloqué avec le fichier xml, une autre option consiste à compter toutes les lignes à l'avance et à mettre en cache cette valeur. Chaque fois qu'une ligne est ajoutée ou supprimée du fichier, vous pouvez en ajouter ou en soustraire une au fichier. Assurez-vous également d'utiliser un entier de 64 bits car il peut y avoir plus de 2^32 lignes.

1

Est-ce que compter les lignes n'est pas vraiment incertain puisque dans XML newline est simplement une chose cosmétique? Il serait probablement préférable de compter le nombre d'occurrences d'une étiquette spécifique.