Frage

Ich habe eine Datenquelle bekam, die eine Liste von Objekten und deren Eigenschaften (eine CSV-Datei, aber das macht nichts) zur Verfügung stellt. Jedes Mal, wenn mein Programm ausgeführt wird, braucht es eine neue Kopie der Liste der Objekte zu ziehen, zu vergleichen, um es in der Liste der Objekte (und ihre Eigenschaften) in der Datenbank gespeichert ist, und aktualisieren Sie die Datenbank je nach Bedarf.

mit neuen Objekten Umgang ist einfach - die Datenquelle gibt jeweils eine sequenzielle ID-Nummer Objekt, prüfen Sie die Top-ID-Nummer in den neuen Informationen für die Datenbank, und du bist fertig. Ich bin für Vorschläge für die anderen Fälle suchen -., Wenn einige Eigenschaften eines Objekts geändert hat, oder wenn ein Objekt gelöscht wurde

Eine naive Lösung wäre, alle aus der Datenbank, die Objekte zu ziehen und das Komplement des Schnittpunktes der beiden Sätze (alt und neu) erhält und dann die Ergebnisse prüfen, aber das scheint, wie es nicht sehr effizient wäre, wenn die Sätze erhalten groß. Irgendwelche Ideen?

War es hilfreich?

Lösung

Der Standardansatz für große Haufen von Datenmengen auf diese.

Wir gehen davon aus, dass list_1 ist der „Master“ (ohne Duplikate) und list_2 ist die „Updates“, die Duplikate haben.

iter_1 = iter( sorted(list_1) ) # Essentially SELECT...ORDER BY
iter_2 = iter( sorted(list_2) )
eof_1 = False
eof_2 = False
try:
    item_1 = iter_1.next()
except StopIteration:
    eof_1= True
try:
    item_2 = iter_2.next()
except StopIteration:
    eof_2= True
while not eof_1 and not eof_2:
    if item_1 == item_2:
        # do your update to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
    elif item_1 < item_2:
        try:
            item_1 = iter_1.next()
        except StopIteration:
            eof_1= True
    elif item_2 < item_1:
        # Do your insert to create the new master list.
        try:
            item_2 = iter_2.next()
        except StopIteration:
            eof_2= True
assert eof_1 or eof_2
if eof_1:
    # item_2 and the rest of list_2 are inserts.
elif eof_2:
    pass
else:
    raise Error("What!?!?") 

Ja, es beinhaltet eine mögliche Art. Wenn list_1 in sortierter Reihenfolge gehalten wird, wenn Sie es zurück in das Dateisystem schreiben, spart das viel Zeit. Wenn list_2 kann in einer Struktur angesammelt werden, dass sie sortiert hält, dann ist das viel Zeit spart.

Sorry über die Weitschweifigkeit, aber Sie müssen wissen, welche Iterator die StopIteration angehoben, so kann man nicht (triviale) wickelt die gesamte while-Schleife in einem großen alten-try-Block.

Andere Tipps

Gibt es keine Möglichkeit, ein „letztes Mal geändert“ Feld aufrecht zu erhalten? Das ist, was es klingt wie Sie wirklich sind:. Inkrementelles Backup, basierend auf zuletzt Sicherung ausgeführt wurde, im Vergleich zum letzten Mal wurde ein Objekt verändert / gelöscht (/ hinzugefügt)

Sie müssen Zeitstempel haben sowohl in Ihrer Datenbank und Ihrer CSV-Datei. Zeitstempel sollten die Daten zeigen, wenn der Datensatz aktualisiert wurde und Sie sollten mit gleichen IDs Zeitstempel des Datensatzes zu vergleichen, um zu entscheiden, ob Sie es aktualisiert werden müssen oder nicht

In Bezug auf Ihre Idee über Kreuzung ... Es sollte umgekehrt durchgeführt werden! Sie haben alle Daten aus CSV in der temporären Tabelle importieren und tun Kreuzung zwischen 2 SQL-Datenbanktabellen. Wenn Sie Oracle oder MS SQL 2008 (nicht sicher, 2005) erhalten Sie ein sehr nützliches MERGE Schlüsselwort gefunden, so dass Sie SQL mit weniger Aufwand schreiben können dann verbringen Sie für Daten in anderen Programmiersprache zu verschmelzen.

Wenn Sie die Liste in das Programm ziehen, iterieren der Liste eine Abfrage auf einer Spalte Eigenschaft in der Datenbanktabelle basiert tun, die wie ObjektName aus der Liste des Objekts auf der gleichen Eigenschaft zuordnet. Oder man könnte die gesamte Tabelle in eine Liste laden und der Liste, die Art und Weise vergleichen. Ich davon aus, dass Sie etwas Einzigartiges über das Objekt, das die Datenbank weist neben der ID vorhanden ist.

Wenn das Objekt in der Tabelle nicht über die Frage gefunden wird, um einen neuen Eintrag erstellen. Wenn festgestellt wird, wie FogleBird erwähnt, hat eine berechnete Hash-oder CRC für das Objekt in der Tabelle gespeichert, die Sie mit dem Objekt in der Liste (Laufe Berechnung auf dem Objekt) zu vergleichen. Wenn die Prüfsummen nicht übereinstimmen, aktualisiert das Objekt mit dem auf der Liste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top