Форум: "Система";
Текущий архив: 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);
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.04.15;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c