Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

народ помогине с blockread   Найти похожие ветки 

 
Azbul   (2002-11-11 14:45) [0]

помогите написать процедуру чтения текстового файла по средствам blockread сразу говорю файл большой ~500-2000 mb так что в память считать весь не получается....


 
MBo ©   (2002-11-11 14:48) [1]

Что именно не получается c процедурой чтения?


 
icWasya ©   (2002-11-11 14:56) [2]

и зачем текстовый файл читать через BlockRead


 
pasha_golub ©   (2002-11-11 15:40) [3]

этот вопрос уже звучал, по моему. И у меня такой же был. Так вот советовали читать не весь файл, а постранично.


 
F1 ©   (2002-11-11 16:00) [4]

Посмотри про
MemoryMappedFile


 
Azbul   (2002-11-11 16:08) [5]

MBo> при процедуке чтения иногда бывает что сама процедура blockread прочитывает не всю строку из файла т.е. начала нету, а есть тока конец (не знаю пока по непонятным мне причинам)

icWasya> а ты пробывал прочитать текстовый файл размером в 2 гб?? на моей машине AMD Athlon 1600+ это занимает примерно 1,5 часа


 
Azbul   (2002-11-11 17:37) [6]

процедурой readln


 
Anatoly Podgoretsky ©   (2002-11-11 17:42) [7]

У тебя что то не в порядке с дисковой подсистемой, в зависимости от скорости дисков от 20 минут до 40 секунд ( первый для случая порядка 1 мб в сек, если очень старый диск)


 
Azbul   (2002-11-11 18:31) [8]

Anatoly Podgoretsky> c файловой системой всё номана просто сама процедура readln работает очень медленно по этому я и решил использовать BlockRead


 
han_malign ©   (2002-11-11 18:35) [9]

А смысл - любой файл все равно читается блоками не меньше 4Кб(для дискеты 512б),и кэшируется в памяти файловой сисстемой.


 
Alex44   (2002-11-11 18:56) [10]

Otlichie ReadLn ot BlockRead (po sushestvu)---eto to, chto ReadLn, posle chteniya, scaniruet resultat i nahodit tam symboly contsa stroki. Hotya, konechno, ne dolzhno eto na mnogo bol"she vremeni zanimat"...


> MBo> при процедуке чтения иногда бывает что сама процедура
> blockread прочитывает не всю строку из файла т.е. начала
> нету, а есть тока конец (не знаю пока по непонятным мне
> причинам)


Bylo by stranno, esli by eto bylo ne tak.

Ya dumayu, otvet na Vash vopros zavisit v znachitel"noj stepeni ot togo, chto Vy sobiraetes" s etim file"om delat".

Da, eshe: problema s ReadLn mozhet byt" vyzvana tem, chto po umolchaniyu u textovogo file"a ochen" malen"kij bufer (128 bytes). Ran"she ego mozhno bylo menyat"; posmotrite povnimatel"nee.


 
Набережных С.   (2002-11-11 22:53) [11]

Попробуй вот это. Только учти - не тестировано, мог и напутать в логике. Но у меня чуть больше гигабайта около 5 секунд читает на очень хилом диске.

type
TOvp = record
Ovp: TOverlapped;
Block: PByte;
end;

procedure TForm1.Button3Click(Sender: TObject);
const
QueryMax = MAXIMUM_WAIT_OBJECTS;
BlockSize: integer = 16 * 4096;
var
Start,Stop: DWORD;
n :integer;
QueryCount: integer;
StepCount: integer;
FileSize: Integer;
CurrentPos:integer;
P:PByte;
HFile: THandle;
Ovp: array[0..QueryMax-1] of TOvp;
begin
Label1.Caption:="";
Application.ProcessMessages;
Screen.Cursor:=crHourGlass;
Start:=GetTickCount;
HFile:=CreateFile("D:\Archive\Archive1.rar",
GENERIC_READ, 0, nil,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or
FILE_FLAG_NO_BUFFERING or
FILE_FLAG_OVERLAPPED, 0);
if HFile = INVALID_HANDLE_VALUE then RaiseLastWin32Error;
FileSize:=GetFileSize(HFile,nil);
if FileSize = 0 then Exit;
GetMem(P,BlockSize*QueryMax);
StepCount:=FileSize div BlockSize;
if FileSize mod BlockSize > 0 then Inc(StepCount);
if StepCount < QueryMax then QueryCount:=StepCount
else QueryCount:=QueryMax;
for n :=0 to QueryCount-1 do
begin
ZeroMemory(@Ovp[n],SizeOf(TOvp));
with Ovp[n], Ovp do
begin
Block:=pointer(integer(P)+BlockSize*n);
if hEvent = 0 then hEvent:=CreateEvent(nil,false,false,nil);
end;
end;

CurrentPos:=0;
repeat
Dec(StepCount,QueryCount);
for n:=0 to QueryCount-1 do
begin
Ovp[n].Ovp.Offset:=CurrentPos;
ReadFile(HFile,Ovp[n].Block^,BlockSize,DWORD(nil^),@Ovp[n]);
Inc(CurrentPos,BlockSize);
end;
if QueryCount > 0 then
WaitForMultipleObjects(QueryCount,@Ovp[0],true,10000);

// Здесь - обработка считанного блока

if StepCount < QueryMax then QueryCount:=StepCount
else QueryCount:=QueryMax;
until QueryCount < 1;

Stop:=GetTickCount;
Label1.Caption:=IntToStr(Stop-Start);
Screen.Cursor:=crDefault;
Application.ProcessMessages;
CloseHandle(HFile);
for n:=0 to QueryMax-1 do
if Ovp[n].Ovp.hEvent <> 0 then CloseHandle(Ovp[n].Ovp.hEvent);
FreeMem(P);
end;



 
Набережных С.   (2002-11-11 23:00) [12]

Вместо
if hEvent = 0 then hEvent:=CreateEvent(nil,false,false,nil);
напиши просто
hEvent:=CreateEvent(nil,false,false,nil);
Забыл убрать:)


 
Fantasist ©   (2002-11-12 05:58) [13]

Когда-то в другом месте, один человек проводил тестирования скорости чтения файлов разными способами. Говорит, что BlockRead самый быстрый. Так что я бы советовал BlockRead и читать блоками (на то он и Blockread). :)


 
vidiv ©   (2002-11-12 08:35) [14]

А Steam ами нельзя?



Страницы: 1 вся ветка

Текущий архив: 2002.11.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
1-69417
Cheester[X3]
2002-11-10 17:45
2002.11.21
Buttonы


14-69577
Shrek
2002-11-04 23:49
2002.11.21
ну и западло


1-69252
jen_bond
2002-11-11 19:51
2002.11.21
перебор переменых


14-69563
kingdom
2002-11-01 13:52
2002.11.21
Ищу человека! Shamsudin


1-69250
jen_bond
2002-11-10 23:12
2002.11.21
Подскажите как можно правильно завершить приложение(MDIAPP).