|
подскажите как оптимизировать чтение с Акцесс, поиск ссылок в базе, замена | ☑ | ||
---|---|---|---|---|
0
zladenuw
17.09.13
✎
10:49
|
осуществляется поиск по артикулу запчасть. если нашли смотрим ее тип. если отличается или новый то создаем и записываем в запчасть.
Процедура Загрузить() Экспорт Результат = Новый ТаблицаЗначений; Результат.Очистить(); adx = Новый COMОбъект("adox.Catalog"); Connection=Новый COMОбъект("ADODB.Connection"); Connection.Open("Driver={Microsoft Access Driver (*.mdb)};Dbq=" + мВыбФайл + ";"""); adx.ActiveConnection = Connection; МассивИменТаблиц = Новый Массив; Для каждого Таблица Из adx.Tables Цикл Если Таблица.Type = "TABLE" Тогда МассивИменТаблиц.Добавить(Таблица.Name); КонецЕсли; КонецЦикла; Для каждого ИмяТаблицы Из МассивИменТаблиц Цикл Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = "Select * from "+ИмяТаблицы; Command.CommandType = 1; RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet = Command.Execute(); RecordSet.MoveFirst(); Результат.Колонки.Добавить("Артикул"); Результат.Колонки.Добавить("Тип"); Попытка RecordSet.MoveFirst(); Исключение RecordSet.Close(); КонецПопытки; RecordSet.MoveFirst(); Пока RecordSet.EOF() = 0 Цикл лНовСтр = Результат.Добавить(); лКодАкссеы = СтрЗаменить(RecordSet.Fields(0).Value,"-",""); лАртикул = Лев(лКодАкссеы,5)+"-"+прав(лКодАкссеы,5); лНовСтр["Артикул"] = лАртикул; лНовСтр["Тип"] =RecordSet.Fields(7).Value; RecordSet.MoveNext(); КонецЦикла; СпрТипЗч = Справочники.ТипЗЧ; СпрЗЧ = Справочники.Запчасти; Для каждого СТрРезультат Из Результат Цикл лНайденнаяЗЧ = СпрЗЧ.НайтиПоКоду(СТрРезультат.Артикул,Истина); Если лНайденнаяЗЧ <> СпрЗЧ.ПустаяСсылка() Тогда лОбъект = лНайденнаяЗЧ.ПолучитьОбъект(); лОбъект.ТипЗЧ = НайтиСоздатьТипЗЧ(СокрЛП(СТрРезультат.Тип)); лОбъект.Записать(); КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры Функция НайтиСоздатьТипЗЧ(пНаименование) Если СпрТипЗч.НайтиПоНаименованию(пНаименование,Истина) = СпрТипЗч.ПустаяССылка() Тогда СпрТипЗч = Справочники.ТипЗЧ; лНовЭ = СпрТипЗч.СоздатьЭлемент(); лНовЭ.Наименование = пНаименование; лНовЭ.Записать(); Возврат лНовЭ.Ссылка; Иначе Возврат СпрТипЗч.НайтиПоНаименованию(пНаименование,Истина); КонецЕсли; КонецФункции // () |
|||
1
Infsams654
17.09.13
✎
11:13
|
(0) сразу бросется в глаза: зачем 2 раза делать НайтиПоНаименованию ?
Если СпрТипЗч.НайтиПоНаименованию(пНаименование,Истина) = СпрТипЗч.ПустаяССылка() Тогда Иначе Возврат СпрТипЗч.НайтиПоНаименованию(пНаименование,Истина); |
|||
2
zladenuw
17.09.13
✎
11:27
|
(1) та да. загоню в переменную.
А вот как быть с поиском. файлики по 400 тыщ строк. долго |
|||
3
МихаилМ
17.09.13
✎
11:48
|
вчера
видел аналогичный бред. где Вы это пример взяли? v8: Получение текста из memo поля в access через ado тут нечего оптимизировать. это пример как не надо писать . г0внокод. сделайте по-человечески. вынесите в отдельные методы подключение получение списка таблиц; метод итератор для заполнения , метод заполнения , метод обработки. и только после этого появится повод для оптимизации. а пока у Вас винегрет из обращений к разным субд. разделяй и властвуй. после структурирования кучу найтиПоНаименованию замените на запрос по списку ссылок. размер списка ограничите 65000. для ускорения перебора выборки ищите темы на форуме по слову "gamewithfire" если используется клиент серверный вариант можно распараллелить на фоновые задания но это все после привидения кода к виду получение данных , обработка данных , передача данных |
|||
4
rsv
17.09.13
✎
11:57
|
(0) Суть в том , что имхааа необходимо сделать в 1С источник(и) данных к БД Акцесс. И уже запрсом соедниять(объединять) с данными. Как то так . Перебор - долго. Хотя как знать . Возможно с источниками данных еще дольше будет но .... надо делайте пробы.
|
|||
5
rsv
17.09.13
✎
11:58
|
+(4) Т.е. с АDO можно и повременить.
|
|||
6
zladenuw
17.09.13
✎
12:02
|
(4) (5) я так понимаю про внешний источник данных. хм. попробую. может и быстрее будет. там же можно будет сделать соединение по полю артикул.
|
|||
7
rsv
17.09.13
✎
12:04
|
(6) Внешние. Они самые.
|
|||
8
zladenuw
17.09.13
✎
12:21
|
(3) прикольно. только 1 но. СОМА НЕТУ НА ЛИНУКСЕ.
|
|||
9
zladenuw
17.09.13
✎
12:21
|
вернее есть на 8.3 но я пока не рискнул
|
|||
10
zladenuw
17.09.13
✎
12:22
|
(3) а за правильность написание спасибо. учту.
|
|||
11
zladenuw
17.09.13
✎
16:28
|
(3) а так уже лучше ?
Перем СпрТипЗч; Перем МассивИменТаблиц; Перем СоотРезультат; Функция ПолучениеСпискаИменТаблиц() adx = Новый COMОбъект("adox.Catalog"); Connection=Новый COMОбъект("ADODB.Connection"); Connection.Open("Driver={Microsoft Access Driver (*.mdb)};Dbq=" + мВыбФайл + ";"""); adx.ActiveConnection = Connection; Для каждого Таблица Из adx.Tables Цикл Если Таблица.Type = "TABLE" Тогда МассивИменТаблиц.Добавить(Таблица.Name); КонецЕсли; КонецЦикла; КонецФункции // ПолучениеСпискаТаблиц() Функция ЧтениеДанныхТаблиц() Для каждого ИмяТаблицы Из МассивИменТаблиц Цикл Результат = Новый ТаблицаЗначений; Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = "Select * from "+ИмяТаблицы; Command.CommandType = 1; RecordSet = Новый COMОбъект("ADODB.RecordSet"); RecordSet = Command.Execute(); RecordSet.MoveFirst(); Результат.Колонки.Добавить("Артикул"); Результат.Колонки.Добавить("Тип"); Попытка RecordSet.MoveFirst(); Исключение RecordSet.Close(); КонецПопытки; RecordSet.MoveFirst(); Пока RecordSet.EOF() = 0 Цикл лНовСтр = Результат.Добавить(); лКодАкссеы = СтрЗаменить(RecordSet.Fields(0).Value,"-",""); лАртикул = Лев(лКодАкссеы,5)+"-"+прав(лКодАкссеы,5); лНовСтр["Артикул"] = лАртикул; лНовСтр["Тип"] =RecordSet.Fields(7).Value; RecordSet.MoveNext(); КонецЦикла; СоотРезультат.вставить(ИмяТаблицы,Результат); КонецЦикла; КонецФункции // ЧтениеДанныхТаблиц() Процедура ПроверкаИЗаполнениеДанныхТаблиц() СпрТипЗч = Справочники.ТипЗЧ; СпрЗЧ = Справочники.Запчасти; Для каждого Результат Из СоотРезультат Цикл ВремТЗ = Результат.Значение; Для каждого СТрРезультат Из ВремТЗ Цикл лНайденнаяЗЧ = СпрЗЧ.НайтиПоКоду(СТрРезультат.Артикул,Истина); Если лНайденнаяЗЧ <> СпрЗЧ.ПустаяСсылка() Тогда лОбъект = лНайденнаяЗЧ.ПолучитьОбъект(); лОбъект.ТипЗЧ = НайтиСоздатьТипЗЧ(СокрЛП(СТрРезультат.Тип)); лОбъект.Записать(); КонецЕсли; КонецЦикла; КонецЦикла; КонецПроцедуры //ПроверкаИЗаполнениеДанныхТаблиц() Процедура Загрузить() Экспорт СоотРезультат = Новый Соответствие; Результат = Новый ТаблицаЗначений; Результат.Очистить(); ПолучениеСпискаИменТаблиц(); ЧтениеДанныхТаблиц(); ПроверкаИЗаполнениеДанныхТаблиц(); КонецПроцедуры Функция НайтиСоздатьТипЗЧ(пНаименование) НайденСсылка = СпрТипЗч.НайтиПоНаименованию(пНаименование,Истина); Если НайденСсылка = СпрТипЗч.ПустаяССылка() Тогда СпрТипЗч = Справочники.ТипЗЧ; лНовЭ = СпрТипЗч.СоздатьЭлемент(); лНовЭ.Наименование = пНаименование; лНовЭ.Записать(); Возврат лНовЭ.Ссылка; Иначе Возврат НайденСсылка; КонецЕсли; КонецФункции // НайтиСоздатьТипЗЧ() МассивИменТаблиц = Новый Массив; |
|||
12
МихаилМ
17.09.13
✎
18:35
|
так конечно лучше. понятнее
лучше передавать параметры, а не объявлять глоб. переменные объявлять все переменные, типизировать поля; не бойтесь "лишних" циклов. старайтесь назвать понятно имена методов в идеале идин метод - одно действие ( ПроверкаИЗаполнение.. - не гуд). каждое осмысленное действие обязано быть вынесено в метод. старайтесь абстрагироваться от источника данных |
|||
13
Зойч
17.09.13
✎
18:39
|
(12) и чем это ускорит?
|
|||
14
Зойч
17.09.13
✎
18:40
|
подозреваю что дольше всего идет создание элементов
|
|||
15
Fragster
модератор
17.09.13
✎
18:50
|
есть еще такое кунгфу:
Поле0 = RecordSet.Fields(0); Поле7 = RecordSet.Fields(7); Пока RecordSet.EOF() = 0 Цикл лНовСтр = Результат.Добавить(); лКодАкссеы = СтрЗаменить(Поле0.Value,"-",""); лАртикул = Лев(лКодАкссеы,5)+"-"+прав(лКодАкссеы,5); лНовСтр["Артикул"] = лАртикул; лНовСтр["Тип"] =Поле7.Value; RecordSet.MoveNext(); КонецЦикла; |
|||
16
Fragster
модератор
17.09.13
✎
18:51
|
вообще, конечно, нужно прогнать замер производительности и от него плясать
|
|||
17
МихаилМ
17.09.13
✎
18:52
|
(13)
пока про ускорение рано говорить. после нормализации можно обсуждать оптимизацию по быстродействию: поиграться с разными методами получения данных, обработки, и передачи (записи) надо понимать что есть базовая практика, best practices, и оптимизация по конкретным параметрам (например по быстродействию). но оптимизация всегда делается под конкретные условия . и в случае изменения условий она может стать совсем не оптимальной. |
|||
18
zladenuw
17.09.13
✎
18:55
|
(16) само долго перебор строк таблицы и поиск ссылки
|
|||
19
zladenuw
17.09.13
✎
18:55
|
(12) учту
|
|||
20
zladenuw
17.09.13
✎
18:56
|
пробую через gamewithfire, но воюю с чтением только нужных полей с файла. попробую и с внешними источниками. и сравню что быстрее
|
|||
21
Зойч
17.09.13
✎
18:56
|
RecordSet.MoveNext()
вот это дольше всего делается? |
|||
22
zladenuw
17.09.13
✎
18:57
|
(21) неа. ПроверкаИЗаполнениеДанныхТаблиц
|
|||
23
МихаилМ
17.09.13
✎
18:58
|
+(15)
есть еще getrows() |
|||
24
zladenuw
17.09.13
✎
19:00
|
(21) в файле 400 тыщ строк. явно в базе 20 тыщ ссылок.
задумался о деления файла в потоки и передавать в фон и там уже поиск и замену реквизита. хотя тогда будет блокировки данных. хотя можно ведь найти и оставить только найденные. а потом 1 циклом заменить |
|||
25
zladenuw
17.09.13
✎
19:01
|
всем спасибо. завтра продолжим :)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |