Da lässt sich noch viel machen
Die Position der Zeilenanfänge kann man nach einem ersten Scan im Speicher halten, das wäre so um die 24 MiB. Dazu kann man einen Zeilen-Cache bauen, dass mit den Blöcken spricht ja für Lokalität im Algorithmus und die 1000 Zeilen kannst du leicht im Speicher halten.
Das Ganze hinter
TStrings
zu verstecken sollte dann nicht so schwer sein.