К списку форумов К списку вопросов
Помогите пож. с ДБФкой
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 индексами по всем полям.

К списку вопросов на форуме 1C

>>