AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

Ein Thema von a.def · begonnen am 4. Jan 2017 · letzter Beitrag vom 6. Jan 2017
Antwort Antwort
Seite 1 von 2  1 2      
a.def
(Gast)

n/a Beiträge
 
#1

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 19:21
Ich habe gerade ein Programm getestet, dass mehrere GB in wenigen Sekunden auf die Platte schreibt
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 19:25
Wo genau willst Du hin?
Du möchtest offenbar ein bestimmtes Byte vielfach in eine Datei schreiben?
Über welche Größenordnung an Dateigröße reden wir konkret? Bislang war in Deinem ersten Beitrag von Kilobytes die Rede.
Über welche Anforderungen an das Zeitverhalten reden wir? Bei "mehreren GB pro Sekunde" reden wir langsam auch von Hardwarefragen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 19:28
Stimmt das sollte ich mal klären.
Es kann um Dateigrößen von Bytes bis GBytes gehen. Je nachdem was man angibt.
Das sollen eigentlich nur dummy-Dateien werden. Den Inhalt kann man ebenfalls bestimmen. Entweder ein zufälliges Zeichen oder ein definiertes Zeichen.

Ich bin schon so weit, dass alles korrekt arbeitet. Nur 7 Sekunden für 512 MB auf eine SSD ist ein wenig happig

P.S.: das Tool, das mehrere GB pro Sekunde schreibt, das war auf meinem PC

Geändert von a.def ( 4. Jan 2017 um 19:39 Uhr)
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 19:45
Möglicherweise musst Du Dich noch mit dem Windows Dateicache auseinandersetzen. Ein und derselbe Code habe hier auf dem System zeigt höchst unterschiedliche Laufzeiten. Die 500 Mbytes benötigen zwischen 1.6 und 8 Sekunden, um ihren Weg auf die Platte zu finden.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, System.Classes,
  System.Diagnostics;

const
  ZwanzichMB = 1024 * 1024 * 20;
var
  LStream : TFileStream;
  LBytes : TBytes;
  LWatch : TStopwatch;
  i : integer;
begin
  DeleteFile('C:\Temp\wuppdi.dat');

  WriteLn('bereite Daten vor ...');
  SetLength( LBytes, ZwanzichMB );
  FillChar( LBytes[Low(LBytes)], Length(LBytes), 42 );

  WriteLn('schreibe Daten ...');
  LWatch := TStopwatch.StartNew;

  LStream := TFileStream.Create( 'C:\Temp\wuppdi.dat', fmCreate OR fmOpenWrite );
  TRY
    for i := 1 to 25 do
      LStream.Write( LBytes, Length(LBytes) );
  FINALLY
    LStream.Free;
  END;

  LWatch.Stop;
  WriteLn( 'fertig nach ', LWatch.ElapsedMilliseconds, 'msecs' );
  ReadLn;
end.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 20:19
Also dieses Beispiel muss ich erstmal verdauen. Denn es funktioniert a) einfwandfrei und b) es ist wahnsinnig schneller.

Ist meine Anpassung, um eine bestimmte Größe schreiben zu können, so in Ordnung?
Mir persönlich gefällt die Prüfung auf <= 0 nicht, weiß aber sonst nicht wie man es machen könnte.

Delphi-Quellcode:
        iFileSizeToWrite := 1024 * 1024 * 512;
        repeat
         // aBufferSize := 1024 * 1024 * 20;

         if aBufferSize > iFileSizeToWrite then
          aBufferSize := iFileSizeToWrite;

         Dec(iFileSizeToWrite, aBufferSize);

         SetLength(aBytes, aBufferSize);
         FillChar(aBytes[Low(aBytes)], Length(aBytes), Ord('A'));
         aFileStream.Write(aBytes, Length(aBytes));
        until iFileSizeToWrite <= 0;

Geändert von a.def ( 4. Jan 2017 um 20:22 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 4. Jan 2017, 21:54
Nimmt einem TBufferedFileStream nicht gerade diese Arbeit ab?
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 03:18
Möglicherweise musst Du Dich noch mit dem Windows Dateicache auseinandersetzen. Ein und derselbe Code habe hier auf dem System zeigt höchst unterschiedliche Laufzeiten. Die 500 Mbytes benötigen zwischen 1.6 und 8 Sekunden, um ihren Weg auf die Platte zu finden.
Gut, auch eine Frage der Hardware...

Anbei ein Bleispiel - Dein Source ohne eine Änderung!

Einmal aus meiner Windows 10 VM

und

Einmal aus dem nativen Windows 10 wo die VM drauf läuft. (Bei laufenden VM)

Mavarik
Angehängte Grafiken
Dateityp: png SpeedTest.png (9,9 KB, 31x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.343 Beiträge
 
Delphi 12 Athens
 
#8

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 09:53
MSDN-Library durchsuchenFlushFileBuffers nach dem Write, dann hat man auch die Zeit bis Windows wirklich alles an den Datenträger geschickt hat.

Aus diesem Grund ist auch beim Schreiben großer Dateien der Durchsatz am Anfang größer, als zum Ende hin, nachdem der RAM überfüllt ist.
Bzw. der Explorer kopiert ja auch am Anfang schneller, außer bei Wechseldatenträgern mit deaktiviertem Schreibcache. (Stichwort "schnelles Entfernen")
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#9

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 6. Jan 2017, 16:33
Andere Möglichkeit:

ms-help://embarcadero.rs_xe7/libraries/System.IOUtils.TFile.WriteAllBytes.html
Delphi-Quellcode:
procedure SaveBytesToFile3(const Data: TBytes; const FileName: string);
 begin
   TFile.WriteAllBytes( FileName, Data ); // uses System.IOUtils
 end;

procedure TForm1.Button24Click(Sender: TObject);
var Data : TBytes;
    FN : String;
    SO : Cardinal;
    Ticks: DWord; Res : Single;
begin
SO:= 1000000000; // 1GB
FN:='G:\TEST\BIGFILE1GB.txt';
  SetLength( Data, SO);
  FillChar( Data[0], SO, $41);
  Memo1.Lines.Add('Start creating '+FN);
  Ticks := timeGetTime; //uses MMSystem
SaveBytesToFile3(Data,FN);
  Res := 0.001 * (timeGetTime - Ticks);
  Memo1.Lines.Add(Format('Time for creating '+FN+' : '+' %.3f s',[Res]));
  Memo1.Lines.Add('Speed per sec: '+ floattostrf(SO / Res, ffNumber, 10, 0)+' Bytes/sec');
end;
--------------------------
USB3.0 - 240GB SSD
Start creating G:\TEST\BIGFILE1GB.txt
Time for creating G:\TEST\BIGFILE1GB.txt : 4,571 s
Speed per sec: 218.770.505 Bytes/sec

Start creating G:\TEST\BIGFILE1GB.txt
Time for creating G:\TEST\BIGFILE1GB.txt : 4,720 s
Speed per sec: 211.864.416 Bytes/sec
----------------------------------------
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#10

AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?

  Alt 5. Jan 2017, 00:14
P.S.: das Tool, das mehrere GB pro Sekunde schreibt, das war auf meinem PC
Wie heisst das?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz