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?

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 2 von 4     12 34   
Daniel
(Co-Admin)

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

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
 
#12

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
Online

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

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

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#14

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

  Alt 4. Jan 2017, 22:28
Warum füllst Du bei jedem Schreibvorgang den Buffer erneut mit 'A' ?

Sag doch mal was Du erreichen willst.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

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

  Alt 4. Jan 2017, 22:39
Warum füllst Du bei jedem Schreibvorgang den Buffer erneut mit 'A' ?

Sag doch mal was Du erreichen willst.

Gruß
K-H
Zitat:
Ich möchte gerne X-Mal ein Zeichen in eine Datei schreiben
Ich denke er will nur eine Methode erlernen ein Zeichen (X-Mal) so schnell wie möglich in eine Datei zu schreiben.

Das scheint er ja mit Hilfe von Daniel erreicht zu haben.
Ein besonderer Grund muss dafür abweichend vom genannten nicht zwingend notwendig sein.
Es steckt manchmal einfach nur der Sinn dahinter etwas lernen zu wollen.

gruss
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#16

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

  Alt 4. Jan 2017, 22:41
Es steckt manchmal einfach nur der Sinn dahinter etwas lernen zu wollen. gruss
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#17

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

  Alt 4. Jan 2017, 22:50
Es steckt manchmal einfach nur der Sinn dahinter etwas lernen zu wollen. gruss
Na ja

Ich finde es gut wie du es machst habe einige deiner erstellten Themen verfolgt.
Du akzeptierst nicht alles was man dir vorlegt, hinterfragst und bist erst dann glücklich wenn du eine für dich
Nachvollziehbare akzeptable Lösung gefunden hast.
Dem ist nicht entgegenzusetzen.

Von daher geht das zurück.

gruss

Geändert von EWeiss ( 4. Jan 2017 um 22:54 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#18

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

  Alt 4. Jan 2017, 22:57
Ich stelle mich oft aber auch extrem dumm an, das muss ich dazusagen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 4. Jan 2017, 22:59
Such hier mal meinen FileSplitter. (große Datenmengen schnell lesen/schreiben)

Es gibt grundsätzlich erstmal mehrere Wege für Dateizugriffe, die auch kombiniert werden können.
* MemoryMappedFiles > Dateiinhalt in den Arbeitsspeicher gemappt
* buffered ReadFile/WriteFile
* nonbuffered ReadFile/WriteFile
* man kann beim Dateiöffnen angeben, ob man sequentiell oder zufällig auf die Datei zugreifen will (das soll angeblich z.B. den WindowsFileCache optiomieren)
* dann kann man das Ganze auch noch synchron oder asynchron ausführen > ReadFile/WriteFile warten bis sie fertig sind oder kehren schon vorher zurück
* wenn man will kann man auch noch 'ne Transaction dazwischenschalten
* und zusätzlichen privaten Pufferspeicher im Programm, vorallem wenn man sehr oft wenige Bytes zusammenhängend hat > also erst in einem Buffer zusammenfassen und dann zusammen in die Datei schreiben, bzw. in einen Buffer auslesen und dann den Kleinkram dort rausholen (macht z.B. das alte Read/Write/ReadLn/WriteLn)

* Windows legt standardmäßig den WindowsFileCache dazwischen, also dein WriteFile landet erstmal da und dann später erst auf der Platte
beim Lesen natürlich andersrum und ein zweiter Lesezugriff ist schneller, wenn es da schon drin ist
* aber z.B. bei Wechseldatenträgern ist der Schreibcache oft deaktiviert (bzw. wird umgehend wieder geleert)
* dann kommt noch der Cache des IO-Controllers und des Datenträgers (HDD)
* die Clustergröße des Dateisystems und die größe der Speicherblöche des Datenträges spielen eine Rolle
* und natürlich auch die Größe der verschiedenen Cache und des freien Arbeitspeichers (für WFC)
* Cache- und Blockgrößen in den Datenträgern unterscheiden sich auch zwischen USBStick/MemoryCard, SSD, HybridDisk und HDD und dann natürlich auch zwischen kleinem und großen Datenträger

So, jetzt hast du millionen Systemkonfigurationen und es ist nahezu unmöglich dass es überall gleich gut läuft, aber man kann gewisse Grundeigenschaften "optimieren".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 4. Jan 2017 um 23:20 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

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

  Alt 4. Jan 2017, 23:00
Ich stelle mich oft aber auch extrem dumm an, das muss ich dazusagen.
geht mir genauso keine Sorge.
Es hat auch nichts mit schleimen zu tun auch verdient es keinen Pokal aber zumindest meine Anerkennung
das du nicht alles so hinnimmst sondern Hinterfragst und LERNEN willst.

OK wird jetzt OT:
Damit ist alles gesagt.

gruss
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz