Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Внизнарод помогине с 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c