![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как копировать данные с последующей обработкой? [D7, WinXP]
tytus © (2006-01-30 15:34:00)Доброго дня ВСЕМ. Создаю MemoryMappedFile (исходный файл - бинарный), размер может быть от 20 до 120 метров. В программе ищу записи (например по номеру байта). Количество найденных записей может быть произвольное - от 0 до 2 млн. (запись состоит из байта заоголовка $84 и следующий байт - длинна записи - 45..75 байт). В процессе поиска записей мне нужно как-то скопировать найденные записи в память и затем обрабатывать уже скопированные записи. Если сразу обрабатывать все записи, то получается очень долго (до 5 мин.). А если произвести только поиск - то 120 метров за 4 секунды. Так вот если в этих 120 метрах будет пусть 1000 записей - все-таки это будет быстрее. Подскажите пожалуйста, как сие дело оформить. Отображенный в память файл не подходит, так как зарание неизвестно количество записей и их суммарный размер.
Набережных С. (2006-01-30 17:11:00) [1]
> tytus (30.01.06 15:48) [2]
> Поиск пакетов производится оператором CASE - и 60 вариантов
> ID пакетов. Есть же разница - обрабатывать CASE 2 млн. раза
> или найти записи (пусть даже 1000), и обработать.
Не совсем понятно. Ты же в первом посте сказал, что количество найденныхможет быть 2 миллиона. И для каждого, как я понимаю, придется делать case - вне зависимости, будешь ты копировать или нет.
Я бы посоветовал вынести собственно поиск и обработку в отдельный поток. Поток ведет поиск, нашел - обработал, результат добавил в свой внутренний список. Набралось, скажем 128 результатов - передал их пакетом главному потоку, а сам начал формировать новый пакет. А главный поток добавляет эти пакеты в общий список и выводит на экран по мере надобности.
А лишнее копирование только увеличивает общее время, причем значительно.
tytus (2006-01-30 16:19:00) [2]>[5]
ОК. Пойду подумаю, если что- ждите с кодом...BYE!
Digitman (2006-01-30 16:14:00) [3]
> tytus (30.01.06 16:11) [4]
Я сомневаюсь, что копирование чего-то куда-то нужно в принципе.
> нужно и скопировать (а затем и добавлять) запись с отображения
> КУДА-ТО
На то, например, есть ф-ция CopyMemory()
tytus (2006-01-30 16:11:00) [4]>Digitman[3]
Да с кодом напряжно - комп и инетом на другом этаже...
Нужен совет желательно с примером, что правильнее использовать - TMemoryStream или другой какой-нить класс, если в процессе поиска известен указатель на начало записи (в отображении файла) и ее размер. Вот нужно и скопировать (а затем и добавлять) запись с отображения КУДА-ТО...
Хотя если идей нет - могу и код принести. Только через время, а время-то идет...
Digitman (2006-01-30 16:02:00) [5]
> tytus (30.01.06 15:48) [2]
Мне это ни о чем не говорит.
Приводи код.
CASE же здесь абсолютно ни при чем.
tytus (2006-01-30 15:48:00) [6]>[1]
Обработка записей включает в себя разбивку записи на пакеты, причем зарание неизвестно - какие пакеты попадутся, всего пакетов около 60. Каждый пакет состоит из своего ID, и данных. Для каждого пакета нужно сформировать строку информации, и рисовать инфу в Grid-e. Поиск пакетов производится оператором CASE - и 60 вариантов ID пакетов. Есть же разница - обрабатывать CASE 2 млн. раза или найти записи (пусть даже 1000), и обработать.
Digitman (2006-01-30 15:41:00) [7]Обрабатывай найденный записи "на месте".
Никто и ничто, судя по на сей момент изложенному тобой, не заставляет их (найденные записи) копировать куда-то для обработки.