Datenabgleich
am 11.07.2012 - 14:22 Uhr in
Hallo,
ich habe eine CSV Liste mit Daten, die ich regelmäßig mit Drupal abgleichen muß. Mein Modul liest die Datei per Drupal-Batch ein und führt ein node_save aus Performance-Gründen nur dann durch, wenn sich die Daten wirklich geändert haben.
Die Frage ist, wie lösche ich am effizientesten die Datensätze, die noch als Drupal-Node existieren, aber nicht mehr in der CSV Datei enthalten sind?
Im Moment fällt mir nur folgendes ein:
1. Den Primärschlüssel (findet sich auch bei jedem CSV-Datensatz, z.B. eine Artikel-Nr.) aller existierenden Nodes in ein Array einlesen, dieses in der Session speichern und während des Batch-Abgleiches die Einträge aus dem Array löschen, die noch in der CSV enthalten sind. Nach dem Import dann die übriggebliebenen Nodes im Array per node_delete löschen. Der Nachteil dabei ist, dass je nach Anzahl der Nodes das Array sehr groß werden kann und dieses Array erst einmal aufgebaut werden muß. Ich habe teilweise CSV Dateien mit über 1 Mio. Datensätzen.
2. Vor dem Update ein Flag in jeder Node auf 0 setzen und beim Update auf 1. Wenn eine Node dann nach dem Update-Batch das Flag noch auf 0 hat, dann muß sie gelöscht werden. Das Problem ist hier, daß ich wirklich jede Node bis zu zweimal updaten muß und node_save braucht schon seine Zeit.
Danke!
Benny
- Anmelden oder Registrieren um Kommentare zu schreiben
Du könntest auch vor dem
am 11.07.2012 - 17:01 Uhr
Du könntest auch vor dem Import-Vorgang alle Nodes im System (die vom Import betroffen sind) auf unveröffentlicht setzen und diese dann während des Imports wieder "veröffentlichen" - die Veröffentlichung eines Nodes braucht ja kein node_save / node_load - hier würde ja eine einfaches Datenbank-Update auf das Status-Feld genügen..
Am Ende der Aktion kannst du dann alle "nicht veröffentlichten" Nodes löschen..
SteffenR
http://www.twitter.com/_steffenr
Drupal-Initiative e.V.