Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
1-46459
Geo
2002-04-02 17:09
2002.04.15
Проблема -использование obj файлов в Дельфи


1-46393
Немировский Шурик
2002-04-02 12:16
2002.04.15
Работа с циклами.


14-46499
MBo
2002-03-07 11:08
2002.04.15
Поздравляю с 8 Марта!


3-46279
Pete
2002-03-24 12:59
2002.04.15
ADO SQL


3-46270
vopros
2002-03-26 09:24
2002.04.15
Как программно добавить поле в таблицу Paradox. Знаю что вопрос недавно был. Но я его не нашел.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский