А теперь ближе к вашему случаю, если самое важное это работоспособность при объёме оперативки меньше объёма файла - надо загружать его кусками, что то типо такого:
function ReadStreamInBatches(f:System.IO.Stream; BatchSize:integer):sequence of array of byte;
begin
var res := new byte[BatchSize];
var left := f.Length;
while true do
begin
if left >= BatchSize then
begin
f.Read(res,0,BatchSize);
yield res;
end else
begin
if left <> 0 then
begin
res := new byte[left];
f.Read(res,0,left);
yield res;
end;
break;
end;
left -= BatchSize;
end;
end;
begin
var f := System.IO.File.OpenRead('my file.txt');
var batches := ReadStreamInBatches(f,100*1024);//считываем по 100 килобайт
foreach var batch in batches do
writeln(batch);
end.
Если же вам надо текстом и кодировками:
function ReadStreamInBatches(f:System.IO.StreamReader; BatchSize:integer):sequence of array of char;
begin
while not f.EndOfStream do
begin
var res := new char[BatchSize];
f.ReadBlock(res,0,BatchSize);
for var i := 0 to BatchSize-1 do
if res[i] = char(0) then
begin
if i = 0 then exit;
var nres := new char[i];
System.Array.Copy(res,nres,i);
res := nres;
break;
end;
yield res;
end;
end;
begin
var str := new System.IO.MemoryStream;//это поток-заглушка
var sw := new System.IO.BinaryWriter(str,System.Text.Encoding.UTF8);//записываем в него 'abcd' в кодировке UTF8
//sw.Write(new char[4]('a','b','c','d'));
sw.Write('abcd'.ToCharArray);//так пожалуй покрасивше
str.Position := 0;//обнуляем позицию в потоке, после того как в него что то записывали она в конце
var sr := new System.IO.StreamReader(str,System.Text.Encoding.UTF8);
var batches := ReadStreamInBatches(sr,3);//считываем по 3 буквы
foreach var batch in batches do
writeln(batch);
end.
Тут я заполнил переменную str
потоком - заглушкой, заполнив его несколькими буквами. Но вы можете присвоить ему результат функции System.IO.File.OpenRead
. Это чтоб показать что работает, не создавая для этого дополнительных файлов.
Конечно, всё ещё остаётся проблема с тем что в оперативку загружается кеш, но возможно это только у меня (я поискал в интернете, вроде ни у кого нет таких проблем).