Форум: "KOL";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
ВнизКак быстро разбить большой файл на много маленьких? Найти похожие ветки
← →
Sormy (2004-08-02 05:09) [0]Имеется файлик на 160 мегов, в начале файлика записаны размеры ресурсов, а затем эти ресурсы следуют один за другим (около 1500).
Метод "читать по байту и записывать в соответсвующий файл на винте" работает ОЧЕНЬ медленно.
Причем, TStream работает даже намного медленнее, чем стандартные blockread, blockwrite...
Подскажите, как это лучше реализовать.
И еще, приложение при этом подвисает и не реагирует на кнопки, сворачивания, разворачивания. Как этого избежать?
← →
Anatoly Podgoretsky © (2004-08-02 07:44) [1]Зачем же по байтц, чиатй по блоку
← →
drew82 (2004-08-02 08:27) [2]а чтобы кнопки нажимались используй Application.ProcessMessages
← →
olookin © (2004-08-02 10:13) [3]TFileStream.Position?
← →
TUser © (2004-08-02 10:57) [4]> Причем, TStream работает даже намного медленнее, чем стандартные blockread, blockwrite...
Это странно. TFileStream вообще-то очень быстро все может прочитать, а потом копируй нужное тебе кол-во байтов.
← →
Iconka © (2004-08-02 11:30) [5]Попробуй по другому организовать хранение данных
← →
Koster (2004-08-02 11:34) [6]Поддерживаю [1]. Выдели буфер в несколько метров, копируй через буфер BlockRead/BlockWrite. Большинство твоих ресурсов будут копироваться за один раз. Побайтовое копирование ни в какое сравнение по скорости не пойдет.
← →
Anatoly Podgoretsky © (2004-08-02 12:13) [7]Koster (02.08.04 11:34) [6]
Ты ничего не понял, у него уже есть размеры ресурсов, поэтому достаточно копировать блоки равные этим ресурсам за РАЗ
← →
PVOzerski © (2004-08-02 12:22) [8]2Anatoly Podgoretsky © (02.08.04 12:13) [7]:
Это верно, хотя есть одна тонкость: мы же не знаем ни размера "маленьких файликов", ни аппаратных характеристик машины. А может выйти и так, что выделение памяти под блок для "маленького файлика" мегабайт этак в 20 вызовет своппинг и прочие прелести. Так что я бы, работая через blockread, подумал и о пределах для размера блоков.
А чтобы кнопки нажимались, я бы вынес обработку файла в отдельный поток. Потому что Application.ProcessMessages во многих случаях замедляет выполнение циклов. Опять же, это зависит от размера маленьких файликов" - есть риск получить "иногда ненадолго просыпающиеся кнопки" вместо нормально активных.
← →
Sormy (2004-08-02 14:09) [9]Огромное спасибо за внимание...
Но я так и не понял, рациональнее использовать blockread, blockwrite или TStream? Или без разницы? (только первый в поток, а второй обойдется :-))
TSream - и так отдельный поток. Зачем еще раз его в поток выделять?
При использовании TStream программа отвисает ненадолго (между файлами)... Наверное, поэтому медленнее и работает (из-за отдельного потока на не P4Hyperthreading машине).
Я использую KOL&MCK! Не понимаю, почему меня перекинули в эту ветвь форума :-). Каков аналог application.processmessages в KOL&MCK?
Файлы размером не более 3мб... Так что наверное сразу блоками по размеру этих файлов читать.
один последний вопрос: Буфер - переменная, как ее в несколько мегабайт создать?
А как реализовать, чтобы кнопки ВСЕГДА активные были? или файловые операции всегда подвешивают программу?
← →
Anatoly Podgoretsky © (2004-08-02 14:14) [10]PVOzerski © (02.08.04 12:22) [8]
Размер указан 160 мб, количество тоже указано 1500, средний размер 100 кб, указано также что файлы маленькие, это означает, что коррелируется со средним размером. Есть хорошая функция CopyFrom, памятью управлять будет система.
← →
Игорь Шевченко © (2004-08-02 14:26) [11]Memory-Mapped Files однако пользовать полезно
← →
Sormy (2004-08-02 14:37) [12]штук 25 по 3 мб, а остальные от 10кб до 300...
В KOL form.processmessagesex нашел :-) Работает и весьма хорошо...
А вот как с остальным?
← →
Sormy (2004-08-02 14:38) [13]Не приведете примерчик, как использовать CopyFrom и Memory-Mapped Files?
← →
Anatoly Podgoretsky © (2004-08-02 14:50) [14]В справке есть пример.
← →
MacroDenS © (2004-08-02 15:16) [15]берешь большой файл, забираешься по выше и швыряешь его на асфальт :-)
← →
Sormy (2004-08-02 15:27) [16]В качестве буфера объявил: c:array [1..$500000] of byte;
Теперь работает реактивно, но как бы размер буфера динамически менять? Дин. массив не прокатывает - указатель он всего лишь, ка быть?
← →
Игорь Шевченко © (2004-08-02 15:38) [17]
> Теперь работает реактивно, но как бы размер буфера динамически
> менять? Дин. массив не прокатывает - указатель он всего
> лишь, ка быть?
Memory-mapped files использовать
← →
Рамиль © (2004-08-02 15:52) [18]
> Зачем еще раз его в поток выделять?
Тебе предложили Stream засунуть в Thread. А не поток в поток:)
← →
Sormy (2004-08-02 16:42) [19]Я думал что Stream=Thread, видимо, ошибался :-)
CopyFrom есть в справке, но вот CopyFrom не пристуствует в текущей версии KOL&MCK.
Memory-mapped files - название раздела в WinAPI, как я понял?
Но там очень много всего! Что, конкретно, надо использовать?
← →
Anatoly Podgoretsky © (2004-08-02 17:03) [20]Так ты про КОЛ спрашиваешь, а почему вопрос тогда здесь, а не там?
← →
Sormy (2004-08-02 17:13) [21]Тема изначально на КОЛ была, только ее модератор кинул к Основным. Видимо, подумал, что я имею ввиду VCL...
Ну дак как там с CopyFrom в Kol?
Я Вас еще там не достал совсем?
← →
Anatoly Podgoretsky © (2004-08-02 17:41) [22]И правильно кинул, поскольку в вопросе ничего про КОЛ не было. Это твоя вина, что не сумел сделать вопрос одназначным.
← →
Sormy (2004-08-02 18:15) [23]Ну, вообще, по Tstream можно было догадаться... В VCL для файлов TFileStream используют (хотя и TStream можно)...
А как там с Memory-mapped files?????????
← →
Игорь Шевченко © (2004-08-02 18:19) [24]
> А как там с Memory-mapped files?????????
Как обычно - CreateFileMapping, MapViewOfFile, и т.д.
← →
Fay © (2004-08-02 18:36) [25]Блин горелый! Как вы в KOL-то оказались?! 8)
З.Ы.
Поддерживаю [24]
← →
ЮрийК © (2004-08-02 20:39) [26]1. Читай Рихтера.
2. Поиск сделай в форуме по Дельфи по названиям функций, там примеры по МаппидФайл кидали.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.042 c