Python Vergleich von zwei massiven Mengen von Daten in die effizienteste Methode möglich
Habe ich zum vergleichen von großen Datenbank-dumps im xls-format zu Parsen Veränderungen Tag-zu-Tag (Brutto, richtig?). Ich bin derzeit dabei, dies in die nach hinten wie möglich und mit xlrd drehen Sie die xls-in csv-Dateien, und dann bin ich mit diffs zu vergleichen.
Da es eine Datenbank ist, und ich habe nicht ein Mittel zu wissen, ob die Daten bleibt immer in der gleichen Reihenfolge nach so etwas wie ein Element löschen, kann ich nicht vergleichen, x line, x line zwischen den Dateien, damit Listen von Tupeln oder etwas würde Sie nicht machen am meisten Sinn für mich.
Ich im Grunde muss jede einzelne änderung, die passiert sein könnten auf jede Zeile UNABHÄNGIG von der Zeile, die position in der aktuellen dump, und die einzige echte "lookup" ich denken konnte, SKU als eine eindeutige ID (es ist eine Produkt-Tabelle aus einer alten DB-system), aber ich muss wissen, viel mehr als nur Produkte gelöscht oder Hinzugefügt werden, da Sie sich ändern könnte, Preise oder sonst etwas in dieser Position.
Soll ich mich mit sets? Und einmal hab ich geladen 75+ tausend Einträge dieser Datenbank-Datei in eine "Reihe", ist meine ram-Auslastung gehen, um den hysterischen?
Dachte ich über das laden in jeder Zeile der xls als eine große verkettete Zeichenfolge hinzufügen, um einen Satz. Ist, dass eine effiziente Idee? Ich konnte im Grunde eine Liste von Zeilen, die sich unterscheiden, zwischen den Sätzen, und dann gehen Sie zurück, nachdem die Zeilen in die original-db-Datei zu finden, meine tatsächliche Unterschiede.
Habe ich noch nie gearbeitet mit Daten-parsing auf einer Skala wie dies. Ich bin meistens nur auf der Suche nach einer Beratung nicht machen, dieser Prozess mehr lächerlich, als es sein muss, und ich kam hier nach nicht wirklich etwas zu finden, schien spezifisch genug, um meinen Fall zu fühlen, wie eine gute Beratung. Vielen Dank im Voraus.
Könnten Sie festlegen, dass die Datenbank-log eine Aufzeichnung der änderungen, die gemacht werden? Es scheint einfacher als zu versuchen, um änderungen zu erkennen, die nach-der-Tatsache.
Ich werde Zustimmen, @Kevin auf diesem; gibt es irgendwelche Einschränkungen, die Sie machen würden, Konfiguration der Datenbank nicht möglich?
Nein, es ist ein legacy-system kann ich nicht Bearbeiten.
Auch das wird auf einem Webserver läuft, also der einzige Grund, warum ich care about RAM. Sorry für die unspezifische.
InformationsquelleAutor vapirix | 2011-12-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwende ich sets für genau diesen Zweck, aber versuchen Sie, die Anzahl der Elemente auf mehrere Millionen. S. Lott sagte, 75,000 ist nichts. Ich benutze ein ähnliches system für das Auffüllen der Datenbank-Tabellen aus importierten date, während nur die Erteilung, die minimale Anzahl von Einfügungen und Löschungen erforderlich, um "patch" die Tabelle aus den Ergebnissen des letzten Imports. Der grundlegende Algorithmus ist entlang der Linien von:
Sich selbst davon zu überzeugen, dass set-Operationen sind schnell und ausreichend RAM effiziente, versuchen Sie dies:
Dauert etwa 1,25 GB auf meinem Mac. Das ist eine Menge von RAM, stimmt, aber wahrscheinlich über 100 mal die Anzahl der Einträge mit dem Sie arbeiten. Die set-Operationen in weniger als einer Sekunde hier.
InformationsquelleAutor Kirk Strauser
Wahrscheinlich nicht. Die Frage ist zu ungenau um Sie zu beantworten, aber.
No. 75000 Objekte ist nicht viel. Dies ist nicht Massiv. Es ist nicht sogar nah an massiven.
Python bietet Ihnen http://docs.python.org/library/difflib.html, die helfen können Sie erstellen eine etwas mehr optimalen Algorithmus.
Da Sie dumping eine Datenbank, es ist besser, es dump als CSV-Datei anstelle einer XLS-Datei. CSV-Dateien sind viel, viel einfacher, mit zu arbeiten.
Hier ist brute-force mithilfe von CSV.
Methode nicht berücksichtigt werden die möglichen verschiedenen Bestellung von Materialien, basierend auf der Datenbank zusammenbrechen Löschung" Was? Die Schlüssel sind die Schlüssel. Fehlende Elemente sind trivial erkannt, indem Sie einige code, um dieses. Da Ihre Anforderungen unvollständig waren, der code ist unvollständig. Sie sind frei, eigene zu schreiben.
InformationsquelleAutor S.Lott
Könnte man das laden der Daten in eine Datenbank und vergleichen der Datenbanken. Wenn Sie denken, dass ist einfacher.
Die zentrale Frage, die Sie vielleicht brauchen, um darüber nachzudenken ist: können Sie die Daten Sortieren irgendwie?
Sortierte Sätze sind so viel einfacher zu handhaben.
P. S. 75000 Zeilen ist nicht sehr viel. Etwas, das passt in Hauptspeicher von einem normalen computer ist nicht viel. Fügen Sie ein paar 0EN.
InformationsquelleAutor Anony-Mousse