Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как быстро разбить большой файл на много маленьких? [Delphi, Windows]


Страницы:   1 2

Sormy ©   (2004-08-02 05:09:00) 

Имеется файлик на 160 мегов, в начале файлика записаны размеры ресурсов, а затем эти ресурсы следуют один за другим (около 1500).

Метод "читать по байту и записывать в соответсвующий файл на винте" работает ОЧЕНЬ медленно.

Причем, TStream работает даже намного медленнее, чем стандартные blockread, blockwrite...

Подскажите, как это лучше реализовать.

И еще, приложение при этом подвисает и не реагирует на кнопки, сворачивания, разворачивания. Как этого избежать?


ЮрийК   (2004-08-02 20:39:00) [1]

1. Читай Рихтера.
2. Поиск сделай в форуме по Дельфи по названиям функций, там примеры по МаппидФайл кидали.


Fay   (2004-08-02 18:36:00) [2]

Блин горелый! Как вы в KOL-то оказались?! 8)

З.Ы.
Поддерживаю [24]


Игорь Шевченко   (2004-08-02 18:19:00) [3]


> А как там с Memory-mapped files?????????


Как обычно - CreateFileMapping, MapViewOfFile, и т.д.


Sormy   (2004-08-02 18:15:00) [4]

Ну, вообще, по Tstream можно было догадаться... В VCL для файлов TFileStream используют (хотя и TStream можно)...
А как там с Memory-mapped files?????????


Anatoly Podgoretsky   (2004-08-02 17:41:00) [5]

И правильно кинул, поскольку в вопросе ничего про КОЛ не было. Это твоя вина, что не сумел сделать вопрос одназначным.


Sormy   (2004-08-02 17:13:00) [6]

Тема изначально на КОЛ была, только ее модератор кинул к Основным. Видимо, подумал, что я имею ввиду VCL...
Ну дак как там с CopyFrom в Kol?
Я Вас еще там не достал совсем?


Anatoly Podgoretsky   (2004-08-02 17:03:00) [7]

Так ты про КОЛ спрашиваешь, а почему вопрос тогда здесь, а не там?


Sormy   (2004-08-02 16:42:00) [8]

Я думал что Stream=Thread, видимо, ошибался :-)
CopyFrom есть в справке, но вот CopyFrom не пристуствует в текущей версии KOL&MCK.
Memory-mapped files - название раздела в WinAPI, как я понял?
Но там очень много всего! Что, конкретно, надо использовать?


Рамиль   (2004-08-02 15:52:00) [9]


> Зачем еще раз его в поток выделять?

Тебе предложили Stream засунуть в Thread. А не поток в поток:)


Игорь Шевченко   (2004-08-02 15:38:00) [10]


> Теперь работает реактивно, но как бы размер буфера динамически
> менять? Дин. массив не прокатывает - указатель он всего
> лишь, ка быть?


Memory-mapped files использовать


Sormy   (2004-08-02 15:27:00) [11]

В качестве буфера объявил: c:array [1..$500000] of byte;
Теперь работает реактивно, но как бы размер буфера динамически менять? Дин. массив не прокатывает - указатель он всего лишь, ка быть?


MacroDenS   (2004-08-02 15:16:00) [12]

берешь большой файл, забираешься по выше и швыряешь его на асфальт :-)


Anatoly Podgoretsky   (2004-08-02 14:50:00) [13]

В справке есть пример.


Sormy   (2004-08-02 14:38:00) [14]

Не приведете примерчик, как использовать CopyFrom и Memory-Mapped Files?


Sormy   (2004-08-02 14:37:00) [15]

штук 25 по 3 мб, а остальные от 10кб до 300...
В KOL form.processmessagesex нашел :-) Работает и весьма хорошо...
А вот как с остальным?


Игорь Шевченко   (2004-08-02 14:26:00) [16]

Memory-Mapped Files однако пользовать полезно


Anatoly Podgoretsky   (2004-08-02 14:14:00) [17]

PVOzerski ©   (02.08.04 12:22) [8]
Размер указан 160 мб, количество тоже указано 1500, средний размер 100 кб, указано также что файлы маленькие, это означает, что коррелируется со средним размером. Есть хорошая функция CopyFrom, памятью управлять будет система.


Sormy   (2004-08-02 14:09:00) [18]

Огромное спасибо за внимание...
Но я так и не понял, рациональнее использовать blockread, blockwrite или TStream? Или без разницы? (только первый в поток, а второй обойдется :-))
TSream - и так отдельный поток. Зачем еще раз его в поток выделять?
При использовании TStream программа отвисает ненадолго (между файлами)... Наверное, поэтому медленнее и работает (из-за отдельного потока на не P4Hyperthreading машине).
Я использую KOL&MCK! Не понимаю, почему меня перекинули в эту ветвь форума :-).  Каков аналог application.processmessages в KOL&MCK?
Файлы размером не более 3мб... Так что наверное сразу блоками по размеру этих файлов читать.
один последний вопрос: Буфер - переменная, как ее в несколько мегабайт создать?
А как реализовать, чтобы кнопки ВСЕГДА активные были? или файловые операции всегда подвешивают программу?


PVOzerski   (2004-08-02 12:22:00) [19]

2Anatoly Podgoretsky ©   (02.08.04 12:13) [7]:
Это верно, хотя есть одна тонкость: мы же не знаем ни размера "маленьких файликов", ни аппаратных характеристик машины. А может выйти и так, что выделение памяти под блок для "маленького файлика" мегабайт этак в 20 вызовет своппинг и прочие прелести. Так что я бы, работая через blockread, подумал и о пределах для размера блоков.

А чтобы кнопки нажимались, я бы вынес обработку файла в отдельный поток. Потому что Application.ProcessMessages во многих случаях замедляет выполнение циклов. Опять же, это зависит от размера маленьких файликов" - есть риск получить "иногда ненадолго просыпающиеся кнопки" вместо нормально активных.


Anatoly Podgoretsky   (2004-08-02 12:13:00) [20]

Koster   (02.08.04 11:34) [6]
Ты ничего не понял, у него уже есть размеры ресурсов, поэтому достаточно копировать блоки равные этим ресурсам за РАЗ


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо