Autor |
Beitrag |
AScomp
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 04.02.09 22:50
Delphi-Quelltext 1: 2: 3:
| fs := TFilestream.create(); fs.size := 4 Gigabyte; fs.free; |

|
|
AScomp 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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.
@Jaenicke: Danke, der 4 KB-Tipp hat nochmal 3 Sekunden gebracht. 
|
|
jfheins
      
Beiträge: 918
Erhaltene Danke: 158
Win 10
VS 2013, VS2015
|
Verfasst: Mi 04.02.09 23:20
AScomp hat folgendes geschrieben : | Die Idee mit dem TFileStream hatte ich auch schon, nur ist das faktisch eine leere Datei. |
Schreib doch an die allerletzte Position ein Nullbyte
Siehe auch www.delphipraxis.net...c149869,0,asc,0.html und www.delphipraxis.net...c150145,0,asc,0.html 
|
|
AScomp 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 04.02.09 23:53
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: Do 05.02.09 14:03
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 15:39
Was haben ein Wipe-Tool und derart große Dateien miteinander zu tun?
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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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. 
|
|
jaenicke
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 16:22
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 05.02.09 20:39
AScomp hat folgendes geschrieben : | 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.
AScomp hat folgendes geschrieben : | 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 
      
Beiträge: 162
Delphi 5, Delphi 7, Delphi 2007, Delphi 2009, Delphi XE, Delphi 10 Seattle
|
Verfasst: 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
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Do 05.02.09 21:31
Aber der Festplatten_Comtroller macht doch nichts anderes, um rauszufinden, wo er hinschreiben muss...
|
|
|