Вниз
Скачать: CL | DM;

Работа с большим файлом...   Найти похожие ветки 

← →
EskimOS   (2002-01-21 10:38) [0]

Как обработать желательно побыстрей большой файл, ну размеров так 35м..............а конкретней задача такая:
есть файл same.xml, size 35Mb...надо в нем найти два одинаковых номера из 5 цифр..и изменить второй номер, не нарушая структуры файла, и скорость обработки желательно большая....


← →
Rem ©   (2002-01-21 13:15) [1]

1. Прочитать блок из исходного файла при помощи BlockRead().
2. Найти подстроку в блоке. Если надо - изменить.
3. Записать в выходной файл при помощи BlockWrite().
4. Повторять п.п. 1..3 до конца файла.

Читать надо большими блоками, например, по 1 МБайт и больше.

Необходимо отдельно обрабатывать ситуацию, когда искомая подстрока попадает на границу блока.


← →
Fellomena   (2002-01-21 13:27) [2]

В качестве варианта, могу предложить механизм файлов, отображённых в файл.
Смысл в том, что твой файл проецируется на адресное пространство, а дальше ты работаешь с ним как с обычным файлом, но все операции проходят гораздо быстрее.


← →
paul_shmakov ©   (2002-01-22 00:47) [3]

да, я присоединяюсь к совету Fellomena. это будет несколько удобнее и, возможно, эффективнее, чем читать самому в буфер.
одно небольшое уточнение к Fellomena (21.01.02 13:27):
фразу ...а дальше ты работаешь с ним как с обычным файлом... следует читать, как "...а дальше ты работаешь с ним как с обычным буфером памяти..." :)


← →
EskimOS   (2002-01-22 09:17) [4]

Что то вроде того ? или нет
//----------------------------------
var Memory : TMemoryStream;
buf :array [1..1024*10] of char;
l:integer;
s:string;

begin
Memory := TMemoryStream.Create;
try

Memory.LoadFromFile("same.xml");
(пошел цикл)...
Memory.Read(buf,1024*10);
......................................


← →
Fellomena   (2002-01-22 10:31) [5]

sorry за опечатку:

"В качестве варианта, могу предложить механизм файлов, отображённых в память."

2 paul_shmakov: спасибо за паправку - именно это и имелось ввиду :)


← →
paul_shmakov ©   (2002-01-22 14:54) [6]

2 EskimOS:
нет, не TMemoryStream. Вам нужны Memory Mapped Files (файлы, отображенные в память).
последовательность такая:

var
hFile, hMap: THandle;
pMap: Pointer;
begin
hFile := CreateFile(...)
hMap := CreateFileMapping(hFile, ...)

while { не просмотрим весь файл } do
begin
// проецирование очередного блока
pMap := MapViewOfFile(hMap, ...);

{ работаем с pMap как с буфером памяти, в который считан
(спроецирован) блок из файла }

UnmapViewOfFile(pMap);
end;

CloseHandle(hMap);
CloseHandle(hFile);



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

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.006 c
1-46444
Kate
2002-04-03 10:08
2002.04.15
Сортировка файлов


1-46417
Eugene1501
2002-04-01 14:13
2002.04.15
Работа с редактором


1-46330
Arhangel
2002-04-03 19:53
2002.04.15
Как поменять системную дату?


14-46490
VID
2002-03-07 00:12
2002.04.15
ДРОВА


14-46500
Olgerd
2002-03-06 18:15
2002.04.15
Специальные символы




   Наверх