Daten in die Mitte von Dateien schreiben

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
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

Hallo zusammen,

ich habe das Problem, dass ich eine sehr große Datenmenge "umsortieren" möchte in ein einziges file.

Algorithmisch sieht das ganze so aus, dass ich ca 180 (di) files habe die jeweils Matritzen der Größe 1600(xi) x 1200(yi) enthalten. Das Endformat sollte eine Datei sein in der die Werte dann in folgender Reihenfolge liegen:

x1 x2
d1 d2 d3 d1 d2
y1-yn y1-yn y1-yn ....... y1-yn y1-yn.....usw

(Anm: geschrieben werden nur die yi, die di und xi habe ich drüber geschrieben um zu sagen wo die y herkommen)

Nun könnte ich natürlich hingehen und jedes der di files aufmachen, die zeile y1-yn für das jeweilige xi rausschreiben, wieder zu machen um es dann beim nächsten xi wieder zu öffnen. Dann öffne ich aber jedes file im Maximum 1600 mal und das will ich unbedingt vermeiden.

Jetzt hab ich mir überlegt, ich könnte besser das erste file d1 aufmachen und erst einmal die xi dieses files schreiben. Dann sähe das Endfile nach dem ersten file so aus:

x1 x2 x3
d1 d1 d1
y1-yn y1-yn y1-yn

Dann öffne ich das zweite file d2, lese die entprechenden zeilen raus und füge sie im Endfile an die verschiedenen Positionen ein, nach dem zweiten file sähe das ganze dann so aus:

x1 x2
d1 d2 d1 d2
y1-yn y1-yn y1-yn y1-yn ...... usw

Auf diese Weise müsste ich jedes File nur ein einziges mal öffnen und wäre nach 180 durchläufen fertig.

Nun hab ich das Einfügen probiert mit dem setzen des Positionszeigers:

Code: Alles auswählen

f.open(file)
f.seek(pos,off)
f.write(daten)
Aber das funktioniert nicht. Mit
f.open(file,"w") überschreibt er naturgemäß alles
mit
f.open(file,"a") schreibt er die daten nicht an der Stelle des gesetzten Positionszeigers, sondern hängt es (ebenfalls wohl ehr naturgemäß) hinten an.

Frage:
Weiß jemand, wie ich die Werte in der Mitte der Datei an den entsprechenden Positionen einfügen kann?
(oder hat eine andere Idee, wie ich mir das schon beinahe wahnsinnige öffnen und schließen der Dateien ersparen kann).

Wäre schön.

Gruß
Mutanab
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
bughunter
User
Beiträge: 19
Registriert: Montag 28. Juli 2008, 13:51

Abhängig von der größe der Dateien würde ich das ganze im Speicher ausführen. Also ohne rücksicht auf Hauptspeicher alles reinladen, kommt natürlich darauf an wie groß die zu sortierende Datenmenge ist...
so könnte man ein dictionary mit allen dateien füllen dann nimmst Du beispielsweise den filename als key und eine list() als dateiinhalt
ich denke mal das die Zeilenweise verarbeitung bei Dir ok ist oder?

Dann machst Du deine Sortierung und schreibst zum schluss alles raus.

Du brauchst also zwei filehandle eines zum lesen aller daten und zum schluss eines zum schreiben. Ggf. kannst Du sogar deine Werte dann schön über die string funktion splitten lassen und elegant die Werte in die resultierende liste einfügen.

Viele Grüße
bughunter
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

Danke bughunter für die schnelle Antwort,

hm, das ist wirklich eine kritische Frage, nach der Größe. Natürlich ist es so wie du es sagst am einfachsten und ich hab auch schon daran gedacht. Rechnen wir doch mal mit den Gegebenen Werten, dann haben wir

1600 x 1200 x 180 = 345.600.000 Werte

das ist doch ganz schön viel.
Bei einem File mit der Größe 1600 x 1200 handelt es sich jeweils um die Kodierung eines Bildes eines dreidimensionalen Objektes das mit (hier) 180 Winkeln aufgenommen wurde und weiterhin aufgenommen wird.
Insofern wäre ein im Speicher-halten gar nicht so verkehrt, weil man dann konfortabler updaten könnte.

Unglücklicherweise, kann es sein, dass die Winkelanzahl (eigentlich kann ich eine winkelauflösung von 10.000 schritten auf 360° machen aber ich bin noch nicht so ganz dem wahnsinn nahe) oder aber die Kamerauflösung sich "verbessert" bzw. hier verschlechtert weil erhöht und das Programm flexibel genug sein soll nachher doch innerhalb größerer Toleranzschwankungen immer noch zu funktionieren.

Frage ist also schließlich im Moment dann erst mal zum ausprobieren schafft die Speicherverwaltung 346mio werte?
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
bughunter
User
Beiträge: 19
Registriert: Montag 28. Juli 2008, 13:51

solange die dateien die verfügbare Hauptspeichergröße nicht überschreiten ist alles im grünen bereich, ansonsten kannst Du evtl. ein splitting vornehmen und arbeitest dich in einzelschritten heran, dann hast du immernoch zeit gespart. Falls notwendig hilft dir ein 64 Bit System (OS & Python), bei mehrnutzung des RAMs wird ohnehing geswappt, aber das sollte man vermeiden. Das Speichermanagement würde sich dann um alles kümmern. Im Extremfall musst Du den Garbage Collector auf die sprünge helfen (gc) um Optimierungen vorzunehmen. (Gilt es zu testen)

Viele Grüße
bughunter
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

Das ist noch ne Idee, in Kauf zu nehmen, jede Datei vielleicht 2, 4 oder 10 mal zu öffnen und dann immer nur die Teile rauszunehmen, die der Hauptspeicher aushält. Immer noch besser als 180 mal.
Wie immer ist die Lösung einfacher als man denkt wenn man zu kompliziert denkt ...danke bughunter, ich glaub, so werd ich es machen.
Kann ja die Splitgröße danach entscheiden wieviele Aufnahmen ich mache, und Anhängen an die Dateien geht ja alle mal.

gruß
mutanab
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
bughunter
User
Beiträge: 19
Registriert: Montag 28. Juli 2008, 13:51

noch weiter gedacht könnte man evtl. dafür speicherklassen definieren und über Klassenserialsierung bzw. Deserialisierung unbenutzte zwischenständer rausfahren und wieder laden. Du würdest also ein Objekt aus dem Speicher ins XML jagen und notfalls deserialisieren (also laden) und es im Speicher wieder vorfinden. Oder Du gehtst brutal ran und lässt das Speichermanagement schwitzen. Daten rein, und mit Process Explorer warten :wink:

Gruß
bughunter
Benutzeravatar
mutanab
User
Beiträge: 21
Registriert: Dienstag 25. März 2008, 15:04

Ja und wenn ich jetzt noch 2 monate weiter denke, werde ich das ganze parallel laufen lassen auf 16 cpus. Aber ich wollt mir auf jedenfall die sparsamste methode überlegen und von anfang an knausern damit es ordentlich wird, außerdem muss ich mir erst das parallel python angucken, scheint aber nicht so schwer zu sein :D
"He, ich bin ein Mensch, aber ich bin fast zwanzigtausend Lichtjahre von zu Hause weg, und wir leben unter stockverrückten Aliens, umgeben von Superwaffen, mittendrin in dem verdammten, wahnwitzigen Trubel galaktischer Geschichte und Politik!"(Algebraist)
Antworten