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