Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-69287
Explorer
2002-11-12 08:47
2002.11.21
EhLib для Д7


1-69441
kingdom
2002-11-11 14:21
2002.11.21
Как скролить TMemo


1-69229
BALU1111
2002-11-11 15:38
2002.11.21
Отключение Task Manager


14-69502
Феликс
2002-11-02 00:21
2002.11.21
Сила ума. (beta ver.) Зацените.


7-69606
DMdeveloper
2002-09-14 18:57
2002.11.21
Работа с USB устройством.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский