Mein Ziel ist es, mit Drupal 7 eine schnelle, zuverlässige und automatisierte Methode für den Zugriff auf schreibgeschützte Daten in mehreren sehr großen Flat-File-Datenquellen ( CSVs , Dokumente mit fester Breite und XML-Dokumente) zu erstellen, die mit Views 3 abgefragt werden können Modul. Ich würde es vorziehen, bereits verfügbare Module zu verwenden, aber das Erstellen eines benutzerdefinierten Moduls ist auch eine Option.
Um Module und Methoden auszuschließen, die für die Aufgabe nicht geeignet sind, finden Sie hier die Statistiken zu den Dateien, mit denen ich arbeite:
- Jährlicher Import: 8.500.000 Zeilen CSV Datei. (Jährlich gelöscht und neu geladen. Hat Primärschlüssel.)
- Wöchentlicher Import: Datei mit 350.000 Zeilen fester Breite. (Wöchentlich gelöscht und neu geladen. Kein Primärschlüssel .)
- Stündlicher Import: 3.400 Zeilen CSV Datei. (Möchte so oft wie möglich aktualisieren und synchronisieren, jedoch nicht mehr als alle 20 Minuten. Hat Primärschlüssel)
- Täglicher Import: XML-Datei mit 200 Elementen. (Täglich geleert und neu geladen. Hat Primärschlüssel)
Das Konvertieren zwischen den drei Formaten ist kein Problem und kann durchgeführt werden, wenn dadurch die Importleistung verbessert oder bessere Tools verfügbar gemacht werden. ( AWK für feste Breite zu CSV usw.) Die Automatisierung des Abrufs und der Konvertierung ist über Cron- und Sh- Skripte einfach , muss jedoch die Drupal 7-Integration noch automatisieren. Die Verwendung von benutzerdefinierten Tabellen ist auch möglich, solange vews die Daten mithilfe von Beziehungen referenzieren kann.
Was wäre die beste Vorgehensweise, um diese Art der Datenintegration mit Drupal 7 durchzuführen? Lasse ich auch wichtige Details zu den Daten aus oder was versuche ich zu erreichen?
Hier sind einige Projekte, an denen ich gerade arbeite, um eine Lösung zu finden. Ich möchte dies erweitern, um anderen bei der Entscheidung zu helfen, welchen Weg sie bei der Arbeit mit größeren Datenimporten einschlagen müssen.
Daten in Knoten importieren:
- Feeds (Derzeit Alpha für D7)
Feeds importieren die Daten zuverlässig. Die Geschwindigkeit ist für die kleineren Datenquellen angemessen, für die 300k + -Tabellen jedoch zu langsam.
Automatisierung über cron und Job Scheduler möglich (aktuell Alpha für D7).
Das Fehlen eines Index oder eines eindeutigen Schlüssels in den Quelldaten erschwert die Verwendung. Es ist schneller als Feeds, aber dennoch langsam, um die sehr großen Tabellen zu importieren.
Die Automatisierung erfolgt über drush und cron.
Benutzerdefinierte Tabellen anstelle von Knoten
- Datenmodul (derzeit Alpha für D7)
Das Datenmodul sieht sehr vielversprechend aus, ist aber im Moment für D7 sehr fehlerhaft. Die Anforderungen an die Automatisierung und die Importgeschwindigkeit können mithilfe von Daten problemlos erfüllt werden, die Zuverlässigkeit ist jedoch unzureichend. Die Views-Integration (Link ist für D6) sieht sehr vielversprechend aus.
- Tabellenassistent (Nicht verfügbar für D7)
Dies wurde als Referenz hinzugefügt. Derzeit gibt es keinen D7-Kandidaten, er könnte jedoch als Ausgangspunkt für ein benutzerdefiniertes Modul dienen.
- Views Schema (Verlassen, nur D6)
Dies wurde als Referenz hinzugefügt. Dies scheint vom Tabellenassistenten in Drupal 6 übernommen worden zu sein.
- Importer (RC2 für D7)
Scheint den Tabellenassistenten (nur D6) für die Views- Integration zu benötigen . Als Referenz hinzugefügt, erfüllt aber nicht die Anforderungen für Ansichten.
@MPD - "Benutzerdefinierte Tabellen" als mögliche Lösung hinzugefügt und Module erweitert. Vielen Dank für diesen Zusatz.
quelle
Ich denke, ein knotenbasierter (oder sogar entitätsbasierter) Ansatz wird Ihren Server mit Millionen von Knoten ausbrennen. Wenn Sie sich außerdem Ihren stündlichen Import ansehen, bedeutet dies, dass Sie mindestens einmal pro Sekunde eine node_save () durchführen. Das ist zu viel für Drupal und verursacht ein Leistungsproblem.
Der Grund dafür ist, dass Sie für diese Inhalte keinen Hook-Mechanismus benötigen, kein Pathauto benötigen (Sie können jedoch einen Alias manuell erstellen, dies ist viel billiger als bei Pathauto), keine Felder benötigen ... Schreiben Sie eine einfache "INSERT" -Abfrage ist 100x schneller als node_save () oder entity_save ().
1 / IMHO die beste Option ist eine benutzerdefinierte Tabelle und ein benutzerdefiniertes Modul für Ihren Datenimport, dann schreiben Sie Views-Handler für die Drupal-Integration.
2 / Der Datenbankcache wird während des stündlichen Imports ungültig. Wenn es zu lange dauert, können Sie über eine Replikation nachdenken. Erstellen Sie in der einfachsten Form zwei identische Tabellen, verwenden Sie die erste, importieren Sie die zweite, ändern Sie Ihre Drupal-Konfiguration, um die zweite Tabelle zu verwenden, synchronisieren Sie die zweite Tabelle mit der ersten (und wechseln Sie dann optional wieder zur ersten). Eine andere Lösung besteht darin, in Ihrem benutzerdefinierten Importskript die INSERT / UPDATE-Abfragen vorzubereiten und zu gruppieren und sie dann nur am Ende in einer Transaktion zu senden, um die Schreibzeit für die Datenbank zu verkürzen.
quelle