Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1106127142
Shizuku
2005-01-19 12:32
2005.02.20
Перенос наработок из VBA в Delphi


14-1107166520
Alexander Panov
2005-01-31 13:15
2005.02.20
Блин, флудеры.


14-1106953426
Narik
2005-01-29 02:03
2005.02.20
Скачайте Demo Delphi 2005


1-1107379949
suharew
2005-02-03 00:32
2005.02.20
Как писать в файл занятый другим приложением.


4-1104796344
Донской
2005-01-04 02:52
2005.02.20
Работа службы под winnt 4.0





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский