Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Вниз

Работа с большим файлом... 


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);




Форум: "Система";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.72 MB
Время: 0.022 c
1-46426           dimonf                2002-04-02 21:13  2002.04.15  
Как сделать, чтобы QuickReport-а не было видно на моей форме?


3-46272           AlGin                 2002-03-14 16:58  2002.04.15  
Установка IB-client на Миллениум


14-46491          rambler               2002-03-05 17:58  2002.04.15  
Вычисления.


1-46359           rem_                  2002-04-04 10:11  2002.04.15  
dll в адресном пространстве Explorer а


1-46331           Sterh                 2002-04-03 22:02  2002.04.15  
WarDialler