1С: Ускорение поиска в массиве структур
Задача: есть два массива структур. Один 500 записей, второй — порядка 900 тыс. Нужно для каждой из 500 записей, найти соответствующую запись из второй структуры.
1 |
ИсходныеДанные=Новый Структура("субабоненты,реестр_замен",Новый Массив(),Новый Массив(),Новый Массив(),Новый Массив()); |
- Массив «субабоненты», заполнен структурами вида «то,лс,ипу,окпу,нс,улица,дом,квартира»
- Массив «реестр_замен», заполнен структурами вида «лс,нп,улица,дом,квартира,ипу,дата_установки»
Решение 1: ищем и сопоставляем в «лоб»
1 2 3 4 5 6 7 8 9 10 11 |
найдено=0; для каждого суб из ИсходныеДанные.субабоненты цикл поз=поз+1; для каждого стр из ИсходныеДанные.реестр_замен цикл если суб.лс=стр.лс тогда найдено=найдено+1; конецесли; конеццикла; конеццикла; сообщить("-сопоставлено лс: "+найдено); |
Замеряем время выполнения…и устаём ждать.. Поиск и сопоставление длится по крайне мере несколько часов..
Решение 2:
А зачем нам в массиве субабонентов держать те данные, которых нет? Правильно, не зачем. Поэтому из массива «реестр_замен», сначала вычленим список л/с, и положим его в отдельный массив. И далее при заполнении из файла массива субабонентов, нужно штатно (функция Найти) проверять нужна такая строчка или нет в результирующем массиве? Функция «Найти» скажем работает ОЧЕНЬ быстро.
1 2 3 |
если ИсходныеДанные.список_лс.Найти(инф.лс)<>неопределено или ИсходныеДанные.список_ипу.Найти(инф.ипу)<>неопределено тогда ИсходныеДанные.субабоненты.Добавить(инф); конецесли; |
В итоге, в массиве «субабоненты» у нас ровно то количество записей, которое в «реестр_замен «, а вовсе не 900тыс.
И дальше пробуем снова сопоставить:
1 2 3 4 5 6 7 8 9 10 |
найдено=0; для каждого суб из ИсходныеДанные.субабоненты цикл поз=поз+1; для каждого стр из ИсходныеДанные.реестр_замен цикл если суб.лс=стр.лс тогда найдено=найдено+1; конецесли; конеццикла; конеццикла; сообщить("-сопоставлено лс: "+найдено); |
Скрипт выполнился уже в приемлемые примерно 400 секунд