Textdateien partiell einlesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Benutzeravatar
Maik81SE
Beiträge: 308
Registriert: Fr 30. Sep 2011, 14:07
OS, Lazarus, FPC: Debian 12 (L 3.0.0.3 FPC 3.2.2); Windows 10 (L 3.99.0.0 FPC 3.2.0)
CPU-Target: x86-64; arm; avr
Wohnort: Lübeck
Kontaktdaten:

Re: Textdateien partiell einlesen

Beitrag von Maik81SE »

Moin...

Da hab ich auch gleich mal eine allgemeine Frage an euch, da 8vh in einem weiteren Projekt für die Krankheit Morbis Addison auf Kurz oder lang auch an den Thema landen werde.

Aktuell speichere 8ch die Daten via TIniFile nach Sektoren.
Da die Entsprechenden User unterschiedliche Daten am Tag anlegen wird sich dahingehend auch die Datenmenge erheblich Unterscheiden.

Ist man in dem Fall mit TIniFile oder partiellen einlesen schneller?

Code: Alles auswählen

label.caption:= 'gnublin.no-ip.info'
Debian 12 (L 3.0.0.3 FPC 3.2.2);
windows 10 (L 3.99.0.0 FPC 3.2.0)

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 170
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Textdateien partiell einlesen

Beitrag von Jorg3000 »

siro hat geschrieben:
Mo 30. Okt 2023, 09:08
128 Byte 8,72 sec
255 Byte 5,19 sec
1024 Byte 2,58 sec
4096 Byte 1,84 sec
8192 Byte 1,70 sec
16384 Byte 1,64 sec
32768 Byte 1,60 sec
65536 Byte 1,58 sec
Top! Danke für die Messung!
Interessant, dass es ab 4 kb Puffer kaum noch nennenswerte Geschwindigkeitssteigerungen gibt. Ab dann wirkt sich eine Verdoppelung der Buffergröße jeweils nur noch minimal aus.
Wenn man Speicher sparen will (heutzutage im kb-Bereich wohl eher nicht mehr), wären auch 16 kb absolut akzeptabel und kaum noch steigerungsfähig.

Aber es zeigt auch, dass man bei Textdateien immer einen eigenen Buffer zuweisen sollte, denn mit dem Standardbuffer von 128 Byte ist es ja wirklich jämmerlich.
Grüße, Jörg

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Textdateien partiell einlesen

Beitrag von wp_xyz »

Maik81SE hat geschrieben:
Mo 30. Okt 2023, 09:33
Moin...

Da hab ich auch gleich mal eine allgemeine Frage an euch, da 8vh in einem weiteren Projekt für die Krankheit Morbis Addison auf Kurz oder lang auch an den Thema landen werde.

Aktuell speichere 8ch die Daten via TIniFile nach Sektoren.
Da die Entsprechenden User unterschiedliche Daten am Tag anlegen wird sich dahingehend auch die Datenmenge erheblich Unterscheiden.

Ist man in dem Fall mit TIniFile oder partiellen einlesen schneller?
8vh, 8ch? Dr. Watson flüstert mir ins Ohr, dass du beim Tippen des "i" um eine Zeile auf der Tastatur zu hoch gerutscht sein könntest, und beim Tippen des "c" von 8vh um eine Taste zu weit rechts... Aber ehrlich: Wo ist das Problem, den Beitrag nach dem Abschicken nochmals durchzulesen und ggfs zu korrigieren?

ArchChem
Beiträge: 83
Registriert: Mo 11. Jul 2022, 10:41

Re: Textdateien partiell einlesen

Beitrag von ArchChem »

Vielen Dank für eure Antworten! Ich werde mal die Möglichkeit mit den manuell allokierten Puffern probieren.

Warf
Beiträge: 1913
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Textdateien partiell einlesen

Beitrag von Warf »

siro hat geschrieben:
Mo 30. Okt 2023, 09:08
10 Byte 85,74 sec
50 Byte 19,24 sec
128 Byte 8,72 sec
255 Byte 5,19 sec
1024 Byte 2,58 sec
4096 Byte 1,84 sec
8192 Byte 1,70 sec
16384 Byte 1,64 sec
32768 Byte 1,60 sec
65536 Byte 1,58 sec
60 KByte 1,59 sec
100KByte 1,59 sec
1MByte 1,59 sec
10MByte 1,57 sec
Was man hier sehr schön sehen kann ist das die Größe von memory pages 4k ist. Du hast massive Verbesserungen bis du die Page Größe voll ausnutzt, und danach gibt's kaum Zuwachs.

Generell ist sie effizienteste Weise eine große Datei zu lesen sie vom betriebsystem in den Speicher Mappen zu lassen. Hierbei bekommt man praktisch einen pointer auf einen Speicherbereich aus dem man dann die Datei auslesen kann. Die Datei wird dann Page Weise in den Speicher gelesen, somit sind tatsächlich nur die Pages im RAM die man auch tatsächlich angefasst hat. Außerdem kann das betriebsystem dabei optimal Dateicoaching betreiben zwischen mehreren Programmen die die selbe Datei benutzen indem einfach die selben Pages geladen werden.
Und zu guter Letzt vermeidet es mehrere read Operationen und damit viele Kontextwechsel.

Einziger Nachteil, es ist tatsächlich nicht sehr einfach umzusetzen (unter Unix die Funktion mmap ist noch relativ benutzbar, die winapi macht das viel komplizierter)

schoschy
Beiträge: 26
Registriert: Di 18. Okt 2022, 15:46

Re: Textdateien partiell einlesen

Beitrag von schoschy »

Die Buffergröße könnte eventuell auch noch mit der Sektorgröße des Dateisystems konkurrieren.
Sprich eine Dateisystem mit 512B Blöcken und eines mit 1MB blocksize werden sicherlich andere Ergebnisse bringen.

Da bei SSDs die blocksize oft bei 4K bzw. 16K liegt, würde das die Messergebnisse erklären.

Damit es nicht nachgelesen werden muss, in der Regel haben HDDs 512/520B, SSDs je nach speichertyp 1K oder 4K als Speicherpunkte. Im Register des Dateisystems, kann die blocksize angepasst werden, sodass je nach anwendungsfall (Datenbank, Dateiserver, Log-Server, Virtualisierungsumgebung, usw.) ein starker Leistungszuwachs erkennbar ist.

Antworten