2010-05-18 5 views
4

Actuellement, j'utilise LIBXML :: SAXParser :: Callbacks pour analyser un grand fichier XML contenant des données de 140 000 produits. J'utilise une tâche pour importer les données de ces produits dans mon application rails.Analyse de très gros fichier XML avec Ruby on Rails (1.4GB) - Existe-t-il un meilleur moyen que SAXParser?

Ma dernière importation a pris un peu moins de 10 heures pour terminer:

rake asi:import_products --trace 26815.23s user 1393.03s system 80% cpu 9:47:34.09 total 

Le problème avec la mise en œuvre actuelle est que la structure complexe de dépendance dans le fichier XML signifie, je dois garder une trace du nœud entier de produit savoir comment l'analyser correctement. Idéalement, je voudrais un moyen de traiter chaque nœud de produit par lui-même et avoir la possibilité d'utiliser XPATH, la taille du fichier nous empêche d'utiliser une méthode qui nécessite le chargement du fichier XML entier en mémoire. Je ne peux pas contrôler le format ou la taille du fichier XML original. J'ai au maximum, 3 Go de mémoire que je peux utiliser sur le processus.

Y at-il un meilleur moyen que cela?

Current Rake Task code:

Snippet of the XML file:

+0

Faut-il le faire dans Ruby? C# ou Java serait-il une option que vous êtes prêt à envisager? –

+0

Il ne doit pas être analysé dans ruby, mais les données seront éventuellement utilisées par une application Rails. Tout ce qui peut l'obtenir dans ma base de données suffira. Ruby semble être le plus facile à coder pour ce problème particulier jusqu'à présent. Je préférerais ne pas utiliser C# sur celui-ci, mais je suis ouvert à Java, PHP, Python, ou Perl si l'un d'entre eux présente une solution particulièrement facile. – DBruns

+0

Vérifiez VTD-XML étendu ou standard vtd-xml, le problème devrait être résolu instantanément .. –

Répondre

1

Pouvez-vous chercher tout premier fichier? Si oui, alors je suggérerais de diviser un fichier XML en morceaux plus petits (disons, 512 Mo ou plus) afin que vous puissiez analyser des morceaux simultanés en même temps (un par cœur), parce que je crois que vous avez un processeur moderne. En ce qui concerne le xml invalide ou mal formé, il suffit d'ajouter ou de faire précéder le XML manquant avec une simple manipulation de chaîne.

Vous pouvez également essayer de profiler votre méthode de rappel. C'est un gros morceau de code, je suis sûr qu'il devrait y avoir au moins un goulot de bouteille qui pourrait vous faire gagner quelques minutes.

+0

Oui, le code n'est pas joli, mais la vitesse n'est qu'un problème mineur. le gros problème est de gérer les dépendances dans certains des prix et des critères du XML. Comme c'est juste une grande liste de produits indépendants, je pourrais éventuellement diviser un peu le fichier et traiter plusieurs fichiers à la fois. Ce n'est pas une mauvaise idée. – DBruns