2011-01-26 9 views
1

J'ai une base de données PostgreSQL avec une certaine structure et j'ai plusieurs millions de fichiers xml. Je dois analyser chaque fichier et, obtenir certaines données et remplir les tableaux dans la base de données. Ce que je veux savoir, c'est le langage/cadre/algorithme le plus optimal pour effectuer cette routine.
J'ai écrit un programme en C# (Mono) en utilisant DbLinq ORM. Il n'utilise pas de thread, il ne fait qu'analyser fichier par fichier, objet table filles et soumet certains groupes d'objets (par exemple 200) à la base de données. Il semble être plutôt lent: il traite environ 400 fichiers par minute et il faudra environ un mois pour terminer le travail.
Je demande vos pensées et conseils.Remplir la base de données PostgreSQL avec une grande quantité de données

+0

Je voudrais savoir si votre programme est goulot sur la lecture et l'analyse des fichiers XML, ou la soumission de données à la base de données. Sauf si vous avez des quantités massives de données de texte, je devinerais le premier. – Thanatos

Répondre

0

Généralement, je crois que Perl est une bonne option pour l'analyse des tâches. Je ne connais pas Perl moi-même. Il me semble que vous avez des exigences de performance si extrêmes que vous pourriez avoir besoin de créer un analyseur XML car les performances d'un analyseur standard pourraient devenir un goulot d'étranglement (vous devriez tester cela avant de commencer à l'implémenter). J'utilise moi-même Python et psycopg2 pour communiquer avec Postgres.

Quelle que soit la langue que vous choisissez, vous voulez certainement utiliser COPY FROM et probablement stdin en utilisant Perl/Python/other language pour alimenter les données dans Postgres. Au lieu de passer beaucoup de temps à tout optimiser, vous pouvez également utiliser une solution sous-optimale et l'exécuter en parallèle extrême, par exemple sur 100 instances EC2. Ce serait beaucoup moins cher que de passer des heures et des heures à trouver la solution optimale.

Sans savoir quoi que ce soit sur la taille des fichiers 400 fichiers par minute ne semble pas TROP mauvais. Demandez-vous s'il vaut la peine de passer une semaine de développement pour réduire le temps à un tiers ou simplement le faire maintenant et attendre un mois.

1

je pense que ce serait plus rapide lorsque vous utilisez de petits programmes dans un tuyau qui:

  • joindre vos fichiers dans un grand cours d'eau;

  • flux d'entrée d'analyse et générer un flux de sortie en format PostgreSQL COPY - le même format pg_dump utilise lors de la création de sauvegardes, similaire à onglets séparés par des valeurs, se présente comme suit:

 
COPY table_name (table_id, table_value) FROM stdin; 
1 value1 
2 value2 
3 value3 
\. 
  • charger le flux COPY dans Postgresq démarré temporairement avec l'option "-F" pour désactiver les appels fsync.

Par exemple sur Linux:

find -name \*.xml -print0 | xargs -0 cat \ 
    | parse_program_generating_copy \ 
    | psql dbname 

Utiliser copie est beaucoup plus rapide que l'insertion avec ORM. La jonction de fichiers parallélisera la lecture et l'écriture dans la base de données. Désactiver "fsync" permettra une grande accélération, mais nécessitera la restauration d'une base de données à partir de la sauvegarde si un serveur tombe en panne pendant le chargement.

Questions connexes