![]() |
Delphi-Version: XE2
Large Text File Viewer programmieren
Hallo,
evtl. kennt jmd. hier dieses Programm: ![]() Damit kann eine beliebig große Datei angezeigt werden, ohne viel Speicher zu verbrauchen. Es wird halt immer nur der Teil aus der Datei angezeigt, der auch angezeigt werden soll. Habt ihr eine Idee, wie man das am besten mit Delphi nachprogrammieren könnte? Das Auslesen der Datei wäre kein Problem, aber woher weiß ich, welcher Teil der Datei ausgelesen und angezeigt werden muss? Wie lässt sich das am besten berechnen? Danke für jeden Tipp! |
AW: Large Text File Viewer programmieren
Die banale antwort lautet, was angezeigt werden kann wird vorher gelesen.
Als Pseudocode ungefähr so:
Code:
wenn Du eine strukturierte Datei hast, ist die Navigation relativ einfach, da Du mit
toread:=clientheight / textheight;
for i:=1 to toread do readln(datei,zeile); Zitat:
Wenn allerdings echter Text enthalten ist, so ist das ein wenig anspruchsvoller. Dann kommst Du eigentlich nicht darum herum zumindestens eine Stringliste einzulesen. Eine andere Möglichkeit wäre eine "Schattendatei" die mit fixen Satzlängen arbeitet, d.h. der längste Satz der Originaldatei gibt die Satzlänge der Schattendatei vor. Wie groß ist eigentlich "large" ? Gruß K-H |
AW: Large Text File Viewer programmieren
Na ja, also mit einer Stringliste müssen wir ja nicht arbeiten.
Am Anfang ist der Dateizeiger bei 0 und wir lesen z.B. immer 1k Blöcke ein (und wandeln das in Zeilen um), bis der Bildschirm komplett gefüllt ist. Der Datensatzzeiger ist nun z.B. bei 2k (wir haben 2x 1k Blöcke eingelesen). Wenn man nun vorwärts scrollt, muss irgendwann der nächste 1k-Block gelesen werden. Na, dann macht man das eben, schmeißt dafür den obersten (der nun nicht mehr sichtbar ist) weg usw. Rückwärtslaufen geht genauso einfach. Man muss nur ein wenig überlegen, aber schwer ist das nicht. |
AW: Large Text File Viewer programmieren
Danke für eure Vorschläge, dann werde ich das mal so versuchen :wink:
|
AW: Large Text File Viewer programmieren
Eine andere Idee wären Memory Mapped Files. Allerdings habe ich damit so was noch nie realisiert. Aber mach dich doch mal in diese Richtung schlau.
|
AW: Large Text File Viewer programmieren
Ich würde eine Abbildung zwischen Zeilenpositionen und Blöcken (gleicher Größe) innerhalb der Datei machen.
Dafür würde ich für mir jeden Block, an den ich ausgelesen habe, merken, welche die erste Zeilennummer im Block ist. Als Blockgröße würde ich 4kB vorschlagen, wenn du eh mit Memory Mapped Files arbeitest. Der Index wäre dann aber auch relativ groß (ca. 20MB-40MB bei einer 20GB großen Datei). Bei größeren Blöcken (zB. 4MB) wäre er entsprechend kleiner (20kB-40kB). Damit würde Springen zu bestimmten Zeilen in der Datei relativ schnell :mrgreen: |
AW: Large Text File Viewer programmieren
Zitat:
|
AW: Large Text File Viewer programmieren
Zitat:
|
AW: Large Text File Viewer programmieren
Zitat:
|
AW: Large Text File Viewer programmieren
Es gäbe ja auch die Möglichkeit die ersten Zeilen zu lesen und während der Anzeige in einem zweiten thread weiter zu lesen.
Gruß K-H |
AW: Large Text File Viewer programmieren
Luckie hat Recht. Memory Mapped Files machen das Anzeigen großer Dateien zum Kinderspiel. Ich hab das vor einiger Zeit mit dieser Klasse ->
![]() |
AW: Large Text File Viewer programmieren
Schau mal hier:
![]() Der TFileStreamEx benutzt Memory Mapped Files. Brauchst nur die Unit runterzuladen und dir eine Instanz des TFileStreamEx erzeugen und kannst dann mit den gewohnten Stream-Methoden auf die Daten zugreifen :) |
AW: Large Text File Viewer programmieren
Ich habe hier auch ein Beispiel wie man damit Zeilen suchen kann:
![]() Damit habe ich eine 350 MiB Registrydatei in wenigen Sekunden gelesen und geparst. (Das habe ich in meinem Registryeditor benutzt, der aber noch immer in der Alphaphase ist und vermutlich auch bleibt.) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz