Autor Beitrag
AScomp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mi 04.02.09 22:33 
Hallo zusammen,

welche Variante würdet ihr wählen, wenn ihr eine 4 GB-große Datei möglichst schnell schreiben müsstet? Die Datei wird mit 4294967296 (= 4 GB) Nullen gefüllt.

Verwende derzeit FileCreate/FileWrite in einer for-Schleife, die jeweils 132 Nullen pro Durchgang schreibt. Zeitaufwand ca. 2 Minuten.

Das muss doch schneller gehen? :-)

_________________
Viele Grüße,
Andy
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 04.02.09 22:38 
Das sind ca. 35 Mebibyte pro Sekunde, das ist für eine Festplatte doch durchaus normal. ;-)

Größere Blöcke, z.B. 4 KiB, könnten die Geschwindigkeit erhöhen, zudem könntest du ans Ende seeken und die Dateigröße zuerst setzen.

Nichtsdestotrotz sind 35 MiB/s schon recht gut, je nach Festplatte. ;-)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 04.02.09 22:50 
ausblenden Delphi-Quelltext
1:
2:
3:
fs := TFilestream.create();
fs.size := 4 Gigabyte;
fs.free;


:mrgreen:
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mi 04.02.09 23:08 
Die Idee mit dem TFileStream hatte ich auch schon, nur ist das faktisch eine leere Datei. Also keine Nullen drin. :D

@Jaenicke: Danke, der 4 KB-Tipp hat nochmal 3 Sekunden gebracht. :-)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Mi 04.02.09 23:20 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Die Idee mit dem TFileStream hatte ich auch schon, nur ist das faktisch eine leere Datei.


Schreib doch an die allerletzte Position ein Nullbyte :P

Siehe auch www.delphipraxis.net...c149869,0,asc,0.html und www.delphipraxis.net...c150145,0,asc,0.html ;)
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Mi 04.02.09 23:29 
Noch eine Frage dazu: Kann TFileStream Dateien größer als 4 GB erzeugen/verwalten? Habe gesehen, dass Size ein Int64 ist, sollte also ja möglich sein unter NTFS.

Und noch was: Weiß jemand was geschieht, wenn man unter FAT32 eine Datei auf diese Methode (TFileStream und Size) erzeugt mit mehr als 4 GB?
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 04.02.09 23:53 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Noch eine Frage dazu: Kann TFileStream Dateien größer als 4 GB erzeugen/verwalten? Habe gesehen, dass Size ein Int64 ist, sollte also ja möglich sein unter NTFS.

Und noch was: Weiß jemand was geschieht, wenn man unter FAT32 eine Datei auf diese Methode (TFileStream und Size) erzeugt mit mehr als 4 GB?

1. Wahrscheinlich schon..? Den Grund hast du doch schon selber genannt.
2. Im Explorer wird soweit ich weiß eine Meldung angezeigt "nicht genug freier Speicher". Denk mal, dass dein Programm dann eine Exception mit ähnlicher Meldung wirft.

Edit: Aber wozu das ganze? Wozu eine so große Datei nur mit nullen befüllen? Soll das ne Art Wipe Tool werden?

_________________
PROGRAMMER: A device for converting coffee into software.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 05.02.09 14:03 
Ja, eine Art Wipe-Tool.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.02.09 15:39 
Was haben ein Wipe-Tool und derart große Dateien miteinander zu tun? :shock:

Füllst du etwa einfach den freien Bereich komplett mit Dateien? Dir ist aber schon klar, dass das Probleme geben kann, wenn du (z.B.) das Laufwerk der Auslagerungsdatei erwischst?
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 05.02.09 15:41 
Jup, da bin ich grad dran.

Wird von anderen Wipe-Tools genauso gehandhabt. Ein entsprechender Treiber ist mir bisher nicht untergekommen, und sowas entwickeln zu lassen... Ich glaub da werd ich arm. :D
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.02.09 16:22 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Wird von anderen Wipe-Tools genauso gehandhabt.
Meins macht das nicht so, einen Treiber braucht das auch nicht. Ich greife direkt auf die Festplatte zu mit Raw Disk Access v.1.1:
www.torry.net/pages.php?id=253

Dabei muss man zwar aufpassen, dass man keine Fehler macht bei der Zuordnung des Speichers, aber ich kann den freien Speicher direkt überschreiben.
Und ich nehme doch stark an, dass andere (professionellere) Tools das ähnlich machen.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 05.02.09 17:08 
Wenn ich das richtig sehe, müsste man so doch Cluster für Cluster prüfen, ob Daten enthalten sind, die noch benötigt werden. Also im Detail: Prüfen, ob die zugehörige Datei noch existiert.

Oder missinterpretiere ich das jetzt?
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 05.02.09 17:19 
Inwiefern meinst du, dass es beim Erstellen einer Datei per TFileStream ein Problem mit der Auslagerungsdatei geben könnte? Meinst du, weil dann nicht mehr genug Platz zum Expandieren der Auslagerungsdatei vorhanden sein könnte, weil ja der gesamte freie Speicher von der leeren Datei beansprucht wird?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 05.02.09 20:39 
user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Meinst du, weil dann nicht mehr genug Platz zum Expandieren der Auslagerungsdatei vorhanden sein könnte, weil ja der gesamte freie Speicher von der leeren Datei beansprucht wird?
Richtig, denn wenn in dem Moment die Auslagerungsdatei vergrößert werden müsste, in dem die Festplatte voll ist, dann hängt Windows zumindest kurz. Es ist mir aber auch schon passiert, dass dann gar nichts mehr ging und ich Reset drücken musste.

user profile iconAScomp hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das richtig sehe, müsste man so doch Cluster für Cluster prüfen, ob Daten enthalten sind, die noch benötigt werden.
Ja, genau. Ich habe geschaut, ob da noch Daten liegen.
Leider war das alles nicht so einfach, die Geschwindigkeit hat anfangs sehr gelitten.

Bei mir ging es aber auch eher darum bestimmte gelöschte Dateien zu überschreiben, nicht um ganze freie Festplattenteile. Ob das da auch so gut funktionieren würde, habe ich nicht ausprobiert. Aber ich glaube schon. Leider liegen die Rechte an dem Code nicht mehr bei mir, sonst könnte ich ihn hier einfach posten.
AScomp Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 162


Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
BeitragVerfasst: Do 05.02.09 20:44 
Ich befürchte, dass das mehr Zeit beanspruchen würde, als den gesamten Festplattenspeicher zu überschreiben. Man müsste ja die ganze MFT durchgehen und prüfen, wo welche Dateien liegen und ob sie noch existieren oder nicht.
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Do 05.02.09 21:31 
Aber der Festplatten_Comtroller macht doch nichts anderes, um rauszufinden, wo er hinschreiben muss...