Форум: "Система";
Поиск по всему сайту: 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.73 MB
Время: 0.03 c
1-46341           Schummi               2002-04-02 07:44  2002.04.15  
Цвет в StringGrid


3-46247           .victor               2002-03-25 13:49  2002.04.15  
Хранение изображений в БД


1-46377           Swinger               2002-03-29 21:42  2002.04.15  
Размер программы


1-46317           Сатир                 2002-04-03 16:27  2002.04.15  
Прячем мышку


3-46280           Roman_tutov@mail.ru   2002-03-26 11:02  2002.04.15  
Добавление новых записей в DBGrid