![]() |
![]() |
neakr 01.10.2004 - 14:43 |
Есть такая обработка: Перем Номер, Часть, Флаг; //******************************************* Процедура Сформировать() ФайлИнд=СоздатьОбъект("XBASE"); ФайлПосад=СоздатьОбъект("XBASE"); ФайлАнкет=СоздатьОбъект("XBASE"); ФайлИнд.ОткрытьФайл("d:\Base_1c\ExtForms\Dbf\index.DBF",,1); ФайлПосад.ОткрытьФайл("d:\Base_1c\ExtForms\Dbf\posada.dbf",,1); ФайлАнкет.ОткрытьФайл("d:\Base_1c\ExtForms\Dbf\People.dbf",,0); Если Фл=0 Тогда ФайлАнкет.Первая(); Иначе ФайлАнкет.перейти(ном); КонецЕсли; Пока ФайлАнкет.ВКонце()=0 Цикл Состояние("Обрабатываем запись № " + ФайлАнкет.НомерЗаписи() + "из "+ ФайлАнкет.КоличествоЗаписей()); Номер=СокрЛП(Строка(ФайлАнкет.Nomber)); ФайлПосад.Первая(); часть="";//? Пока ФайлПосад.ВКонце()=0 Цикл Если Номер=СокрЛП(Строка(ФайлПосад.Nomber)) тогда Часть=ФайлПосад.Ind_vch; прервать; КонецЕсли; ФайлПосад.Следующая(); КонецЦикла; ФайлИнд.Первая(); Флаг=0;//? Пока ФайлИнд.ВКонце()=0 Цикл Если ФайлИнд.index=часть Тогда Флаг=1; КонецЕсли; ФайлИнд.Следующая(); КонецЦикла; Если Флаг=1 Тогда ФайлАнкет.Удалить(); ФайлАнкет.Предыдущая(); Сообщить("Запись для человека с " + Номер + " удалена") Иначе Сообщить("Запись для человека с " + Номер + " оставлена") КонецЕсли; ФайлАнкет.Следующая(); КонецЦикла КонецПроцедуры В общем файл анкет порядка 70 000 записей вторая - посад - 200 000 записей третья индекса - 300 записей. Первая идет по циклу, птом ищет по номеру чела во второй, оттуда берет номер вч и проверяет на присутствии его в 3. Если человека нету в списке вч соотв. анкета удаляется. как убыстрить этот процесс уже полтора суток дошло только до 30 000 анкет. машина довольно слабая (П2 - 350) но перекинуть базу на другую не получится (это армия секретность и прочая по.......нь) помогите пож. заранее благодарен |
Муму после всплытия 1 - 01.10.2004 - 14:50 | проиндексировать нужно было................. две последние таблицы |
neakr 2 - 01.10.2004 - 14:50 | Извините, что так настойчиво поднимаю, но обед через пол часа кончается, а до работы еще минут 15 переть |
Мулька 3 - 01.10.2004 - 14:51 | Закачай все в ТЗ и не парься |
Карлсон Великий и Ужасный 4 - 01.10.2004 - 14:51 | Ну я бы для начала в ТЗ загнал. |
Муму после всплытия 5 - 01.10.2004 - 14:52 |
да.................... а вот это вот зачем ФайлАнкет.Удалить(); ФайлАнкет.Предыдущая(); |
neakr 6 - 01.10.2004 - 14:53 | (3-4) пасиб. мне че то даже в голову не пришло это |
neakr 7 - 01.10.2004 - 14:56 | (5) - удалить текущую запись и перепрыгнуть назад на одну так как после удаления поционирование идет на предыдущую вроде как |
Карлсон Великий и Ужасный 8 - 01.10.2004 - 14:56 | А уж если проиндексировал, то используй ФайлПосад.Найти() |
neakr 9 - 01.10.2004 - 14:58 | всем пасиб я побежал ... |
Муму после всплытия 10 - 01.10.2004 - 14:59 |
(7) да-да.................. я все забываю про SET DELETE ON................ если установить ФайлАнкет.ПоказыватьУдаленные(1)............ тогда прыгать не нужно...................... но это не суть |
Муму после всплытия 11 - 01.10.2004 - 15:06 | только бы не расстреляли.......................... военные - люди суровые................. |
Карлсон Великий и Ужасный 12 - 01.10.2004 - 15:18 | (11) Надо в камеру на пару дней. С собой дать только ЖКК, два тома. |
ProxyInspector 13 - 01.10.2004 - 15:42 |
Проще надо быть. Открываешь Access, подсоединяешь эти 3 таблицы, конструктором создаешь запрос. Мне кажется через 3 минуты получишь ответ. Может быть через 5 минут |
Муму после всплытия 14 - 01.10.2004 - 15:47 |
(12) гы................... (13) вам тоже проще нужно........................ открывете ФоксПро.............................................. |
DES 15 - 01.10.2004 - 16:07 |
Всем проще нужно быть... Открываете Excel -> внешние данные ... |
ProxyInspector 16 - 01.10.2004 - 16:24 |
Было такое дело в одной базе данных (SQL) надо было проанализировать две таблицы по 10 тыс записей и найти записи в одной таблице, которых нет в другой. Разработчики сделали так: перебирали записи в одной таблице и в другой и сравнивали. Им надо было сделать 100 млн сравнений и можете представить сколько времени это занимало. Если написать правильный SQL запрос, то это занимало несколько минут. Здесь же надо выполнить порядка 70тыс*200тыс*0.3тыс=10**12 сравнений. будет очень долго. |
Angel IL 17 - 01.10.2004 - 16:33 |
(16) Думаешь "правильный" как то иначе сравнивает данные?... если применять рашмор в фоксе, то и перебор-сравнение будут быстрее чем правильный запрос в акцессе... сам лично проверял, лет 5 назад, к 1С это отношения не имеет :) |
ProxyInspector 18 - 01.10.2004 - 17:03 |
В пятницу делать ничего не охота, поэтому решил проверить. 1. Взял dbf файл своей базы "Регистр Товары" размер 200 мб количество записей 1 млн 2. Сделал копию этого же файла 3. Открыл Accees и присоединил эти файлы 4. В одном файле удалил 3 строчки. 5. С помощью запроса выполнил сравнение этих двух файлов Затраты времени: 1. Копирование файла во временную папку 30 сек 2. Создание второй копии 30 сек 3. Открытие Access 30 сек 4. Удаление записей из таблицы 30 сек 5. Создание запроса с помощью конструктора 3 мин 6. Выполнение запроса 1 мин. В 10 минут уложился. Я думаю поиск методом перебора занял бы несколько часов, а через таблицу значений порядка несколько десятков минут. Дело в том, что Access делает виртуальный индекс (в памяти)и с ним уже работает. Таблица значений - это тот же dbf c индексами по всем полям. |