[Python-de] Daten in Datei einfuegen

Georg Mischler schorsch at schorsch.com
Mit Apr 21 14:32:14 CEST 2004


Alexander 'boesi' Bösecke wrote:

> moin
>
> Ist es moeglich in Dateien Daten an beliebiger Stelle einzufuegen, ohne
> das die vorhandenen Daten ueberschrieben werden? Und das mit einer
> Methode, die auch noch plattformuebergreifend funktioniert?

Nein. Oder soll das System die existierenden Daten auf der
Platte rumschieben?


> Die Größe der zu schreibenden Daten ist bekannt, also koennte ich ja die
> Datei vorm schreiben mit 0-Bytes auffuellen. Aber wie mach ich das?

Unter unix kannst du ein seek() über das Dateiende hinausmachen,
wodurch automatisch alles bis zu deiner neuen Position mit \0
gefüllt wird. Das Dateisystem alloziert für Blocks (Grösse variiert),
in die du nichts geschrieben hast, auch keinen Platz auf der Platte.
Erst wenn du dort das erste mal tatsächlich etwas hinschreibst (und
seien es lauter explizite \0), wird physikalisch Raum beansprucht.

Unter anderen Systemen, und vielleicht auch bei einigen exotischen
Dateisystemen unter unix, funktioniert das meines Wissens so nicht.


> Das wuerde funktionieren, wenn ich die Datei vorm schreiben an der
> passenden Stelle teile und danach wieder zusammenfuege. Geht das ohne
> die Datei einzulesen (die Dateien koennen mehrere 100MB bis > 1GB gross
> sein)?
>
> PS: die Größe der einzufuegenden Daten ist immer 1MB, falls das wichtig
> sein koennte.

Muss das wirklich eine einzelne grosse Datei sein?
Würde es sich nicht anbieten, aus jedem dieser 1MB Stücke jeweils
eine eigene Datei zu machen, und irgendwie einen Index darüber
zu führen? Da scheint ja jedesmal eine in sich abgeschlossene
"Einheit" Daten enthalten zu sein.

Ob bei dieser Grösse der Overhead von zusätzlichen open()s
noch/schon einen signifikanten Einfluss auf die Performance hat,
müsstest du ggf. ausprobieren, das kann auch je nach System
variieren. Die Suchbewegungen des Lesekopfes auf der Platte
sind nach 1MB vernachlässigbar. Und bei denjenigen Dateisystemen,
welche fragmentieren können, machst du dich vom aktuellen Zustand
der Platte so auch weniger abhängig.



-schorsch

-- 
Georg Mischler  --  simulations developer  --  schorsch at schorsch com
+schorsch.com+  --  lighting design tools  --  http://www.schorsch.com/