shelves mergen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ich habe verschiedene shelves. Hintergrund ist, dass ich diese nur zum temporären Speichern von Zwischenergebnissen dienen. Die Dateien sind recht groß ( > 100 MB).

Jetzt möchte ich gerne einige dieser Dateien zusammenfassen. Und zwar so, das kein Datensatz verloren geht. Es ist davon auszugehen, dass die Schlüssel teilweise identisch sind. Im Falle eines identischen Schlüssels muß der neue Datensatz also einen neuen erhalten. In etwa:

Code: Alles auswählen

import shelve
x = shelve.open('data1.she')
y = shelve.open('data2.she')

for key, value in y.iteritems():
    if x.has_key(key):
          x[new_key] = value
    else:
          x[key] = value
Da ich mehr als nur zwei Datensätze habe, suche ich noch nach einer effizienten und sicheren Methode 'new_key' zu generieren. Ideen? Vorschläge?

Danke,
Christian
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich denke nicht, dass es da eine andere Möglichkeit gibt. Zumindest fällt mir keine ein - habe allerdings noch nicht allzu viel damit gemacht, lasse mich gerne vom Gegenteil überzeugen...;)
lunar

Darf man fragen, was der tiefere Sinn davon ist? Für mich hört sich das nach "Code Smell" an ... zumindest ist es wenig effizient.

Eine andere Lösung wäre, ein temporäres Wörterbuch zu erstellen, dass Schlüssel auf Listen abbildet. Dort fügst du alle Datensätze an. Wenn eine Liste mehr als ein Element hat, kann du für alle weiteren mit Ausnahme des ersten Schlüssel erzeugen, in dem du einfach einen möglichst nicht bereits vorhandenen Schlüssel erzeugst, und den "in" Operator zur Überprüfung nutzt, ob dieser Schlüssel nicht doch bereits im Wörterbuch existiert.

Sobald jede Liste dann nur noch ein Element hat, kannst du die Daten wieder schreiben.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

lunar hat geschrieben:Darf man fragen, was der tiefere Sinn davon ist? Für mich hört sich das nach "Code Smell" an ... zumindest ist es wenig effizient.
Darf man. Und Du hast recht :-).

Punkt ist, dass ich die Shelves für Durchläufe einer MC-Simulation anlege. Und da ich nicht perfekt bin und das Programm a) theoretisch abbrechen kann und b) sowieso besser mehrere Durchläufe braucht, die man hinterher analysieren kann, bin ich auf shelves ausgewichen. Nicht ideal, aber ein gutes Bordmittel. Da man dieses Zusammenfassen für einen Datensatz höchstens einmal machen muß ist mir auch egal, ob das ein halbes Stündchen braucht oder nicht ... ;-)

Inzwischen ist mir auch eine Lösung eingefallen: Ich lassen einfach einen Zähler mitlaufen: Der ist immer neu und um mindestens 1 größer als der alte Schlüssel, wenn ich dem Schlüssel hinten dran einfach Ziffern anhänge. Da die Schlüssel nur sicherstellen sollen, dass jede Lösung nur einmal vorkommt (mit der Einschränkung, dass vorher halt ein MC-Algo lief, bei dem zumindest in der Theorie auch mal gleiche Parameter auftreten können) ist die Schönheit und Lesbarkeit des Schlüssel schnuppe.

Jau, das ist ziemlich häßlich - aber es erfüllt seinen Zweck ...

Gruß,
Christian
lunar

Die Schlüssel tragen gar keine Information, sondern werden nur generiert, damit das ganze in ein Shelve packen kann?! Also einfach nur, damit die Daten zur gewählten Speicherstruktur gepresst werden können?
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Jein: Die Schlüssel tragen zu dem Zeitpunkt des Mergens keine Information mehr - bei den einzelnen MC-Läufen schon - bin ja nicht ganz auf den Kopf gefallen ;-). Da aber meine Auswerteroutine von der schon gegenben Datenstruktur ausgeht und ich keinen Bock habe für diesen (Ausnahme-)Fall umzuschreiben, lasse ich es halt bei der Struktur.
lunar

CM hat geschrieben:Jein: Die Schlüssel tragen zu dem Zeitpunkt des Mergens keine Information mehr - bei den einzelnen MC-Läufen schon - bin ja nicht ganz auf den Kopf gefallen ;-).
Ach so, tschuldigung ...

Aber: Wenn der Schlüssel nur während der MC-Läufe wichtig für eine Abbildung bzw. das Nachschlagen ist, benötigst du danach doch keine Shelves mehr, oder? Du kannst doch die Daten aus den Shelves lesen und direkt fortlaufend pickeln (und den Schlüssel bei Bedarf halt mit einem Tupel dazu packen). Für mich hört sich das so an, als wäre da jetzt ein künstliches Problem.
Antworten