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?
Textdateien partiell einlesen
- Maik81SE
- Beiträge: 327
- Registriert: Fr 30. Sep 2011, 14:07
- OS, Lazarus, FPC: Debian 12 (L 3.4 FPC 3.2.2)
- CPU-Target: x86-64; avr
- Wohnort: Lübeck
- Kontaktdaten:
Re: Textdateien partiell einlesen
Code: Alles auswählen
label.caption:= 'gnublin.no-ip.info'
- Jorg3000
- Lazarusforum e. V.
- Beiträge: 359
- Registriert: So 10. Okt 2021, 10:24
- OS, Lazarus, FPC: Win64
- Wohnort: NRW
Re: Textdateien partiell einlesen
Top! Danke für die Messung!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
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
Re: Textdateien partiell einlesen
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?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?
Re: Textdateien partiell einlesen
Vielen Dank für eure Antworten! Ich werde mal die Möglichkeit mit den manuell allokierten Puffern probieren.
-
- Beiträge: 2118
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Textdateien partiell einlesen
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.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
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)
Re: Textdateien partiell einlesen
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.
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.