Ich habe eine Vielzahl (ein paar Tausend)
CSV-Dateien. Die möchte ich allesamt auswerten.
Der naive Ansatz
- Datei einlesen mit TStrings::LoadFromFile(..)
- Datei zerstückeln mitmyStrings.Split(..)
- Eventuell weitere Verarbeitung
funktioniert auch bestens. Es dauert aber zu lange. Bei ca. 5000 Dateien zu 24 KB braucht das Delphi-Programm auf meinem System (mit SSD) ca. 45 Sekunden.
Der Flaschenhals ist eindeutig (und überraschenderweise)
TStringList::LoadFromFile
. Lade ich genau die gleiche Datei ein zweites mal ein, ist das in "Null Millisekunden" getan.
Es wird also technisch:
- Windows
- NTFS-Dateisystem. Clustergröße wahrscheinlich fest 512 Bytes.
- Eine Menge von Dateien im gleichen Verzeichnis möglichst schnell in den Speicher befördern
Was muss ich tun? Gibt es etwas, um alle Dateien einmal am Stück zu holen? Windows'
Memory Mapped Files habe ich bislang immer nur für das Gegenteil- Viele, andauernde Operationen auf großen Dateien gehört...