|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Низкая скорость чтения из файла
вообщем вопрос, как повысить скорость чтения инфы из файла (данные в файле значение неимееют) в переменную ТИПА int, dword.
ибо скорость в 6 Мбайт в минуту ))))) конечно.... Говори что думаешь, думай, что говоришь. (Шоссе 60) |
#2
|
|||
|
|||
Дык ты код покажи сначала.
Хотя... 6 МБ в МИНУТУ - это у тебя тогда явные проблемы с железом... |
#3
|
|||
|
|||
)))))))))))))))))))))))))))))))))))))))
вопрос вот именно в этом как повысить скорость чтения инфы из файла (данные в файле значение неимееют) в переменную ТИПА int, dword. )))))))))) P.S. с железом как раз все в порядке. Код:
var NumRead1, NumRead2, NumWritten: Integer; Buf: Byte; x, y, z: Byte; y1 : array [0..511] of byte; n, max, i: Integer; I1: Integer; m: array[1..3] of Integer; Stream1, stream2 : TFileStream; begin m[1]:=0; if OpenDialog1.Execute then begin Stream1:=TFileStream.Create(OpenDialog1.FileName, fmOpenRead); m[1]:=Stream1.Size; Stream1.Seek(0, soFromBeginning); end; ..... For I:=0 to n1-1 do // цикл на количество секторов begin for i1:=0 to 511 do // побайтно внутри сектора begin Stream1.ReadBuffer(x, sizeof(x)); // считывание байта () из файла в переменную типа byte ......... z:=x xor y; ......... stream2.WriteBuffer(z, sizeof(z)); // запись () в файл в переменной типа byte Position := i; end; end; end; ... END; тормозит именно ЭТО! - stream2.WriteBuffer(z, sizeof(z)); // запись байта () в файл в переменной типа byte Stream1.ReadBuffer(x, sizeof(x)); // считывание байта () из файла в переменную типа byte может ктото знает другой тип переменной ну.. скажем типа hex? или некий 16 - ричный тип переменных? Говори что думаешь, думай, что говоришь. (Шоссе 60) |
#4
|
||||
|
||||
А обязятельно побайтно читать? Прочитай 512 байт сразу, сделай с ними что-нить и запиши обратно. Будет в 512 раз быстрее
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
хм... а тип целого числа розмерносьтю в 512 байт неподскажеш? )))))))
)) в чьом проблема? проблема в том, чтобы зделать z:=x xor y; ))) а оно - только с целочисленными данными!!! ну.... понятно, там таблица анси символов и прочее... неважно. важно результот, который аж... аж .. 6 Мб/ мин. ))))))))) Говори что думаешь, думай, что говоришь. (Шоссе 60) |
#6
|
|||
|
|||
Читай в PChar, потом работай внутри него.
Собственно, в свое время именно таким образом у меня был построен поиск в одной программе. Она читала файл блоками по 64К и работала внутри них. Там правда было чуть сложнее, т.к. приходилось хитрым образом обрабатывать вариант, когда искомая строка находилась на границе блока. |
#7
|
|||
|
|||
Цитата:
)) Цитата:
потом из чара переводить в целое... потом обратно.. пробовал - еще медленнее ))))))))) Говори что думаешь, думай, что говоришь. (Шоссе 60) |
#8
|
||||
|
||||
Где-то так
Код:
var ByteBuf: array[0..511] of Byte; //... Stream1.ReadBuffer(ByteBuf[0], 512); for i1:=0 to 511 do x := ByteBuf[i1]; |
#9
|
|||
|
|||
спасибо - чуть быстрее ) есть еще идеи?
Говори что думаешь, думай, что говоришь. (Шоссе 60) |
#10
|
||||
|
||||
поиграй размером блока ( можно за раз и 32кБ например а в конце остаток )
и как на счет записи - записывай тоже блоками. |
#11
|
|||
|
|||
скажу сразу - размер блока аж никакущей роли неиграет )))) суть проблеммы - описана выше. считывание, или перевод вещественного типа в целочисленный
Говори что думаешь, думай, что говоришь. (Шоссе 60) |