[Python-de] Daten in Datei einfuegen

Alexander 'boesi' Bösecke boesi.josi at gmx.net
Don Apr 22 11:30:19 CEST 2004


Hi

Am 21.04.2004 14:32:14 schrieb Georg Mischler:

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

Ok, macht wirklich nicht viel Sinn. Denkbar waere, das man an den
Clustergrenzen Daten einfuegen koennte, aber da wuerde ja selbst ein
ext2 fragmentieren...

> 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.

Meinst du soetwas hier?
FileSize = 1048576
f = open('test.txt', 'w')
f.seek(FileSize - 1)
f.write('.')
f.close()

Das erzeugt bei mir (XP, getestet auf FAT32 und NTFS) eine 1MB grosse
Datei. 

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

Ich kann mich also nicht drauf verlassen, dass die obige Methode auf
jedem Dateisystem funktioniert? Oder wovon ist das abhaengig?
 
> 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.

Also die Daten gehoeren schon zu einer Datei. Aber ich bekomme die Datei
nur in Bloecken (halt diese 1MB grossen Daten). Die Reihenfolge, in der
die Bloecke ankommen ist nicht garantiert, aber die Position ist bekannt.

> 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. 

Mit der obigen Methode dauert das erzeugen einer 700MB grossen Datei,
700 1MB oder 70 10MB grossen Dateien PiMalDaumen gleich lang. Von daher
waere das egal, aber ich glaub nicht das ich soviele Dateien auf Platte
haben will. 

Aber das bringt mich auf eine Idee: Man koennte die Bloecke in einer
"DBM-Datei" speichern, als Index wuerde ein str(BlockPos) dienen. Weiss
jemand spontan, wie weit dabei die Geschwindigkeit beim schreiben und
lesen einbrechen wuerde? Ich weiss, das haengt sicher sehr stark von der
konkreten Implementierung des dbm-Moduls ab, aber so als Anhaltspunkt...

thx & cu boesi

-- 
So stellt sich der Atheist doch die                  #1671 : icq-intern
Unsterblichkeit vor - Lokalverbot                #73628288 : icq-extern
auf dem Friedhof.                                boesi111 : aim
                                                      i171 : reallife