Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
Delphi 12 Athens
|
AW: TFileStream.Write langsam, wenn man nur 1 Zeichen schreibt?
4. Jan 2017, 23: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".
$2B or not $2B
Geändert von himitsu ( 5. Jan 2017 um 00:20 Uhr)
|