Mon objectif est de produire une méthode rapide, fiable et automatisée pour accéder aux données en lecture seule contenues dans plusieurs très grandes sources de données de fichiers plats ( CSV , Fixed Width et XML docs) en utilisant Drupal 7 qui peut être interrogé à l'aide de Views 3 module. Je préférerais utiliser des modules déjà disponibles, mais la construction d'un module personnalisé est également une option.
Pour vous aider à exclure les modules et méthodes non adaptés à la tâche, voici les statistiques sur les fichiers avec lesquels je travaille:
- Importation annuelle: fichier CSV de 8 500 000 lignes . (Purgé et rechargé chaque année. Dispose d'une clé primaire.)
- Importation hebdomadaire: fichier à largeur fixe de 350 000 lignes. (Purgé et rechargé chaque semaine. Pas de clé primaire .)
- Importation horaire: fichier CSV de 3 400 lignes . (Voudrait mettre à jour et synchroniser aussi souvent que possible, mais pas plus que toutes les 20 minutes. Dispose d'une clé primaire)
- Importation quotidienne: fichier XML de 200 éléments. (Purgé et rechargé quotidiennement. Dispose d'une clé primaire)
La conversion entre les trois formats n'est pas un problème et peut être effectuée si elle améliore les performances d'importation ou permet de mettre à disposition de meilleurs outils. ( AWK pour Fixed Width en CSV , etc.) L'automatisation de la récupération et de la conversion est facile via les scripts cron et sh , mais doit encore automatiser l'intégration de Drupal 7. L'utilisation de tableaux personnalisés est également possible tant que vews peut référencer les données à l'aide de relations.
Quelle serait la meilleure pratique pour réaliser ce type d'intégration de données avec Drupal 7? De plus, est-ce que je laisse de côté des détails importants concernant les données ou ce que j'essaie d'accomplir?
Voici quelques projets que j'examine actuellement pour trouver une solution. Je voudrais développer cela pour aider les autres à décider de la route à suivre lors de l'utilisation d'importations de données plus importantes.
Importation de données dans des nœuds:
- Flux (actuellement Alpha pour D7)
Les flux importeront les données de manière fiable. La vitesse est raisonnable pour les petites sources de données, mais elle est trop lente pour les tables de 300k +.
Automatisation disponible avec cron et Job Scheduler (actuellement Alpha pour D7).
Le fait de ne pas avoir d'index ou de clé unique disponible dans les données source rend cette utilisation difficile. Il est plus rapide que les flux, mais reste lent à importer les très grandes tables.
L'automatisation est disponible via drush et cron.
Tables personnalisées au lieu de nœuds
- Module de données (actuellement Alpha pour D7)
Le module Data semble très prometteur, mais est très bogué pour D7 pour le moment. Les exigences d'automatisation et de vitesse d'importation seraient facilement satisfaites à l'aide des données, mais la fiabilité fait défaut. L' intégration des vues (lien est pour D6) semble très prometteuse.
- Assistant de table (non disponible pour D7)
Ajouté ceci pour référence. Il n'y a pas de candidat D7 à ce stade, mais pourrait servir de point de départ pour un module personnalisé.
- Schéma des vues (abandonné, D6 uniquement)
Ajouté ceci pour référence. Cela semble avoir été absorbé par l'assistant de table dans Drupal 6. Encore une fois, ajouté uniquement pour référence.
- Importateur (RC2 pour D7)
Semble nécessiter l' assistant de table (D6 uniquement) pour l' intégration des vues . Ajouté pour référence, mais ne répond pas aux exigences de vues.
@MPD - Ajout de "tables personnalisées" comme solution possible et extension des modules. Merci pour cet ajout.
la source
Je pense qu'une approche basée sur un nœud (ou même une entité) brûlera votre serveur avec des millions de nœuds. De plus, en regardant votre importation horaire, cela signifie que vous allez faire un node_save () au moins une fois par seconde. C'est trop pour Drupal et cela cause un problème de performances.
La raison derrière cela est pour ces contenus, vous n'aurez besoin d'aucun mécanisme de hook, vous n'aurez pas besoin de pathauto (mais vous pouvez créer manuellement un alias, c'est beaucoup moins cher que pathauto), vous n'aurez pas besoin de champs ... une simple requête "INSERT" est 100 fois plus rapide que node_save () ou entity_save ().
1 / À mon humble avis, la meilleure option est un tableau personnalisé et un module personnalisé pour l'importation de vos données, puis écrivez des gestionnaires de vues pour l'intégration Drupal.
2 / Le cache de la base de données est invalidé lors de l'importation horaire. Si cela prend trop de temps, vous pouvez penser à une réplication. Dans la forme la plus simple, créez deux tables identiques, utilisez la première, importez dans la seconde, changez votre configuration Drupal pour utiliser la deuxième table, synchronisez la 2ème table avec la 1ère (puis revenez éventuellement à la première). Une autre solution est dans votre script d'importation personnalisé, préparez et groupez les requêtes INSERT / UPDATE, puis envoyez-le uniquement à la fin en une seule transaction pour réduire le temps d'écriture de la base de données.
la source