Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как реализовать динамический буффер в BlockRead? [D6, WinXP]


Страницы:   1 2

guard_gg ©   (2006-06-17 00:14:00) 

Как реализовать динамический буффер в BlockRead?
Я хочу что бы весь файл грузился за один заход. Реально ли это?

Procedure SomeProcedure;
Var
Buf     : array of Char;
F       : File;
FSize,
Readed  : LongWord;

Begin
AssignFile(F, ‘test.gpp’);
Reset(F, 1)
FSize := FileSize(F);
SetLength(Buf, FSize);            // До энтого момента все прекрасно, Buf = (#00, #00, #00, ... )
BlockRead(F, Buf, FSize, Readed); // А после этой процедуры "умирает" Buf = ()

if buf[1] = #13 then ...          // Здесь возникает вполне понятное исключение, но вопрос был не в этом.
...
...
...
End;


begin...end   (2006-06-17 09:21:00) [21]

> Defunct ©   (17.06.06 09:11) [10]

Гы. Тогда зайдём с другой стороны: ПРИЧИНУ "лучшести" можно узнать?


Defunct   (2006-06-17 09:11:00) [22]

То и значит.


begin...end   (2006-06-17 09:00:00) [23]

> Defunct ©   (17.06.06 08:55) [8]

Что значит "лучше"?


Defunct   (2006-06-17 08:55:00) [24]

guard_gg ©   (17.06.06 01:10) [3]

Глупость какая-то.
Поверьте TFileStream будет работать куда лучше чем задуманная вами галиматья с BlockRead


Rial   (2006-06-17 01:41:00) [25]

Проводил тесты.
Максимальная производительность при чтении, равно как и при записи
достугается, очевидно, при размере буфера, кратном размеру
кластера файловой системы.
То есть для стандартной NTFS этот буфер имеет размер 4096 байт.

Макс. скорость чтения будет при размере буфера от
1 до 10 размеров кластера, т.е. 4096 - 40960 байт.

Далее скорость чтения/записи снижается.
При размере буфера порядка 100 МБ скорость уменьшается вдвое.

Тесты проводились на фалах большого размера, чтобы
исключить влияние дисковых буферов при повторном чтении.

Поэтому TMemoryStream при работе с большими файлами пришлось переписать.

Чтобы читать весть файл сразу сделай так:

Type TVoidArray=Array[0..0]of Byte;
       ptVoidArray=^VoidArray;

function FileGetSize(Const Bad:Integer):Int64;//Только тут TFileStream помог
var
 Pos: Int64;
begin
 Pos := Seek(0, soCurrent);
 Result := Seek(0, soEnd);
 Seek(Pos, soBeginning);
end;

Var N:Int64;
    ptV:ptVoidArray;
begin
FileOpen(..);
Try
N:=FileGetSize(Bad);
GetMem(ptV,N);
Try
 FileRead(Bad,Buf^,N);
 ...
Finally
 FreeMem(ptV,N);
end;
Finally
FileClose(Bad);
end;


DrPass   (2006-06-17 01:29:00) [26]


> это всетаки гораздо быстрее?

Нет, не гораздо. По-большому счету, одна команда blockread не гарантирует, что файл будет заливаться целиком за один раз. Да он и не будет - файл будет читаться поблочно, постепенно заполняя буфер


Джо   (2006-06-17 01:18:00) [27]

 BlockRead(F, Buf[0], FSize, Readed);


guard_gg   (2006-06-17 01:15:00) [28]

To Rial.

Малость ошибся когда набирал тему на форуме.
Я вливал данные не в сам указатель, забыл '^' поставить
BlockRead(F, Buf^, FSize, Readed);

Так есть способы заливать файл целиком, это всетаки гораздо быстрее?


guard_gg   (2006-06-17 01:10:00) [29]

To GanibalLector

> Не пойму зачем такие сложности??? Ведь есть куча классов
> : TStream,TFileStream. Почему бы Вам ими не воспользоваться?
>


Не люблю пользоваться чужими модулями, и модулями библиотеки VCL;

Программирую практически только процедурами и функциями WinAPI.


GanibalLector   (2006-06-17 00:36:00) [30]

Не пойму зачем такие сложности??? Ведь есть куча классов : TStream,TFileStream. Почему бы Вам ими не воспользоваться?


Rial   (2006-06-17 00:28:00) [31]

BlockRead(F,Pointer(Buf)^, FSize, Readed);

Buf - это указатель на массив. То есть в Вашем коде считываются данные
не в сам массив, а в 4-байтный указатель, и в область
памяти, находящуюся ЗА ним, а не ту, НА КОТОРУЮ он указывает.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо