Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.15;
Скачать: 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 вся ветка

Текущий архив: 2002.04.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
14-46506
Alx2
2002-03-07 10:04
2002.04.15
Поздравляю дам, нашедших себя на поприще программинга, с 8 Марта!


3-46295
IronHawk
2002-03-21 10:58
2002.04.15
Иммитация нажатия клавиш DBNavigator !


6-46476
ATLANTIDO
2002-01-31 23:39
2002.04.15
Опять не работает сокет


1-46410
Bilya
2002-04-02 13:41
2002.04.15
Список импортируемых функций!!!!


3-46233
AlexNord
2002-03-23 07:56
2002.04.15
Blolb поля на Insert в IB SQL