Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 65 раз
Рейтинг: 0
Доброго времени суток. Платформа7.7
Задача: Есть 2 эксель файла по 5000 позиций в каждом (приблизительно). нужно зделать выборку по условии в третий файл. Вопрос: Эфективность(скорость) роботы обработки будет выше если сначала переместить эти файлы в ТЗ, а уж потом обрабатывать или напрямую робота с ексель файлами, или нет никакой разницы в скорости в обоих случаях? Если кто эксперементировал, подскажите. Мне лень писать 2 обработки и сравнивать их потом. ))) Проще написать одну. :-) Спасибо за понимание.
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...
Группа: Основатель
Сообщений: 13982
Из: Киев
Спасибо сказали: 4550 раз
Рейтинг: 3679.4
Я думаю, на 5000 строк вы особой разницы не почувствуете . Та и писать то тут, в принципе, фигня. Процентов 70 кода будет одинакового в обоих обработках
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 65 раз
Рейтинг: 0
Цитата(Vofka @ 26.07.12, 9:03)
Я думаю, на 5000 строк вы особой разницы не почувствуете . Та и писать то тут, в принципе, фигня. Процентов 70 кода будет одинакового в обоих обработках
:-) Уже почти дописал... Протестирую и напишу разницу во времени... А так же код... Может кому пригодится.. ))))
Для теста я использовал: 1. Виртуальный диск выделенный в оперативной памяти. 2. Два ексель документа по 5000 позиций 3. Алгоритм прямой роботы с ексель. (А) 4. Алгоритм роботы через Таблицу Значений. (Б) Результат: Алгоритм А показал 5 минут и 19 секунд Алгоритм Б показал 52 секунды.
Привожу Вашему вниманию более быстрый Извините за то-что он не изящен. Торпился написать и протестить.
Процедура Выполнить2() Имя=КаталогИБ()+"\xls\open.xls"; Лист=СоздатьОбъект("Excel.Application"); Лист.Workbooks.Open(Имя); //Добавляем новый документ ТЗ1 = СоздатьОбъект("ТаблицаЗначений"); ТЗ1.НоваяКолонка("Код"); ТЗ1.НоваяКолонка("Имя"); ТЗ1.НоваяКолонка("Цена"); Лист.ScreenUpdating = 0; Лист.EnableEvents = 0; Лист.Visible = 0; сч=0; строкаЕхель=1; пока сч<10 Цикл Ячейка=СокрЛП(Лист.Cells(строкаЕхель,2).Value); Если Ячейка="" Тогда сч=сч+1; Иначе сч=0; ТЗ1.НоваяСтрока(); ТЗ1.Код=СокрЛП(Лист.Cells(строкаЕхель,1).Value); ТЗ1.Имя=СокрЛП(Лист.Cells(строкаЕхель,2).Value); ТЗ1.Цена=0; //Сообщить(ТЗ1.Код); //Сообщить(ТЗ1.Имя); КонецЕсли; строкаЕхель=строкаЕхель+1; КонецЦикла;
Имя2=КаталогИБ()+"\xls\test.xls"; Лист2=СоздатьОбъект("Excel.Application"); Лист2.Workbooks.Open(Имя2); //Добавляем новый документ ТЗ2 = СоздатьОбъект("ТаблицаЗначений"); ТЗ2.НоваяКолонка("Имя"); ТЗ2.НоваяКолонка("Цена"); сч=0; строкаЕхель=1; пока сч<10 Цикл Ячейка=СокрЛП(Лист2.Cells(строкаЕхель,1).Value); Если Ячейка="" Тогда сч=сч+1; Иначе сч=0; ТЗ2.НоваяСтрока(); ТЗ2.Имя=СокрЛП(Лист.Cells(строкаЕхель,1).Value); ТЗ2.Цена=СокрЛП(Лист.Cells(строкаЕхель,6).Value); //Сообщить(ТЗ2.Имя); //Сообщить(ТЗ2.Цена); КонецЕсли; строкаЕхель=строкаЕхель+1; КонецЦикла;
Имя3=КаталогИБ()+"\xls\Результат.xls"; Лист3=СоздатьОбъект("Excel.Application"); Лист3.Workbooks.Open(Имя3); //Добавляем новый документ строкаЕхель=1; ТЗ1.ВыбратьСтроки(); Пока ТЗ1.ПолучитьСтроку()=1 Цикл ТЗ2.ВыбратьСтроки(); Пока ТЗ2.ПолучитьСтроку()=1 Цикл Если ТЗ1.Имя=ТЗ2.Имя Тогда Лист3.Cells(строкаЕхель,1).Value=ТЗ1.Код; Лист3.Cells(строкаЕхель,2).Value=ТЗ1.Имя; Лист3.Cells(строкаЕхель,3).Value=ТЗ1.Цена; //Сообщить(); //Сообщить(ТЗ1.Код); //Сообщить(ТЗ1.Имя); //Сообщить(ТЗ2.Цена); строкаЕхель=строкаЕхель+1; КонецЕсли; КонецЦикла; КонецЦикла; //****************************************************** Лист.ScreenUpdating = 1; //Ускореем Лист.EnableEvents = 1; //Вывыд Лист.Visible = 1; //в EXEL //****************************************************** Сообщить(ТекущееВремя()); форма.закрыть(); КонецПроцедуры
Сообщение отредактировал logist - 26.07.12, 9:20
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...
Группа: Основатель
Сообщений: 13982
Из: Киев
Спасибо сказали: 4550 раз
Рейтинг: 3679.4
Медленный вариант для сравнения тоже было бы интересно посмотреть
Цитата
нужно зделать выборку по условии в третий файл.
Я просто подумал, что нужно из одного файла и второго по условию для каждого отдельно что-то выбрать в третий файл. Но по коду выше, видимо, нужно сравнивать между собой записи в эксэль файлах 1 и 2 (каждую строку с каждой) и результаты писать в третий. В общем, я в таком случае не удивлен результатом .
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0
Цитата(l2d808 @ 26.07.12, 10:24)
Если Вам не трудно, покажите код.
Я давал совет из практики по упр.прил. 8.2., вкратце это выглядит так (это код 8.2. УП):
Функция ПолучитьПорциюСтрокИзExcelФайла(НачСтрока, КонСтрока, ПутьФайла)
xlLastCell = 11; НомерЛистаExcel = 1; ИмяФайла = СокрЛП(ПутьФайла); ВыбФайл = Новый Файл(ИмяФайла); Если НЕ ВыбФайл.Существует() Тогда Сообщить("Файл не существует!"); Возврат Ложь; КонецЕсли;
Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(ИмяФайла); ExcelЛист = Excel.Sheets(НомерЛистаExcel); Исключение Сообщить(ОписаниеОшибки()); Возврат ложь; КонецПопытки;
Для Row = НачСтрока По КонСтрока Цикл // здесь читаем строки и пишем их в таблицу Значение = ExcelЛист.Cells(Row,НомерКолонки).Value; КонецЦикла; Excel.WorkBooks.Close(); Excel = 0;
Возврат ТаблицаЗагрузки;
КонецФункции
Сообщение отредактировал logist - 26.07.12, 9:45
Личные бесплатные консультации не даю, для этого есть форум!
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 65 раз
Рейтинг: 0
Платформы немного отличаются. Но общий фон я понял. Я так и сделал в варианте Б. ексель лист передал в ТЗ и обрабатывал я уже Таблицу значений. Я думал существует алгоритм который ускорит роботу при прямой роботе с диском: типа честями брать файлы и эти части как-то обрабатывать в процессе.
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0
Цитата(l2d808 @ 26.07.12, 10:52)
Я так и сделал в варианте Б. ексель лист передал в ТЗ и обрабатывал я уже Таблицу значений.
Вы не поняли совсем то что выше - это процедура которая читает порцию и передает ее в ТЗ, именно ПОРЦИЮ а не сразу весь файл, в этом и есть выигрыш производительности.
Личные бесплатные консультации не даю, для этого есть форум!
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 65 раз
Рейтинг: 0
Цитата(logist @ 26.07.12, 11:48)
это процедура которая читает порцию и передает ее в ТЗ,
Я действительно не понял... как при помощи алгоритма, в данной ситуации, реально улучшить скорость обмена между шиной и HDD, на порядок выше или равно со скоростью обмена между шиной и ОЗУ? у меня ОЗУ DDR3-2400 скорость которой - 19200МБ/с. А HDD hitachi Внутренняя скорость передачи данных 170 Мбайт/с. и того 19200/170=112,941 раз приблизительно. Возможно данный алгоритм и улучшит производительность системы, при условии, если брать информацию не блокими, а целым файлом... Но Вы меня не убедили... Ваш алгоритм не работает по принципах, которые Вы регламентировали выше. Или возможно я не д конца все понял... Если Вам не будет трудно, адаптируйте Ваш принцип порционной обработки под версию 7,7. Век живи, век учись... Хочу научится... И сообщесттву будет интересно... Мне нравятся нестандартные решения, хотя, они не всегда оптимальны... Простите меня за каламбуры, но этот алгоритм я хотел бы понять.... А так же спасибо и Вам за понимание...
Цитата(sava1 @ 26.07.12, 13:48)
используйте АДО
Вы смотрите на проблему с позиции сольного програмиста. Достаточно проблематично научить пользователей понять что АДО это тоже среда))))
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...
научить пользователей понять что АДО это тоже среда
А при чем тут пользователи? Вы написали обработку, использующую стандартный функционал Винды, а пользователю вооще по-барабану - как вы получаете данные из екселя (да и до оптимальности алгоритма)
Группа: Местный
Сообщений: 9564
Из: Kharkiv, UA
Спасибо сказали: 2536 раз
Рейтинг: 0
Цитата(l2d808 @ 27.07.12, 0:31)
Если Вам не будет трудно, адаптируйте Ваш принцип порционной обработки под версию 7,7.
Будет трудно, я не знаю 7.7. Оценку производительности я оценил сугубо по визуальному времени выполнения, есть DBF файл 49881 строка, если читать сразу файл в таблицу (при этом происходят еще некоторые действия с данными) то выполняется ~31-33 минут, если читать порциями по 200 строк то выполняется ~23-25 минут. В чем выигрыш не знаю, я не настолько специалист, что бы рассуждать о производительности на уровне шины и ОЗУ. Я вижу что процесс выполняется быстрее, мне этого достаточно.
Личные бесплатные консультации не даю, для этого есть форум!
Группа: Местный
Сообщений: 248
Из: Советский Союз
Спасибо сказали: 65 раз
Рейтинг: 0
Цитата(logist @ 27.07.12, 9:38)
выполняется ~31-33 минут, если читать порциями по 200 строк то выполняется ~23-25 минут. В чем выигрыш не знаю
Возможно у Вас специфика обработки передаваемых данных в програму такова, что порционноость у Вас играет роль. В моем случае нужно в полном обьеме сопоставлять данные из двух источников. Вот поэтому я и удивился - узнав что может быть алгоритм сопоставления двух массивов на основе порционного забора данных. Такой алгоритм розработать можно (как мне кажется), но прироста производительности в этом случае мы не добьемся. При увеличении цикличности в алгоритмах - увеличевается машинное время на реализацию оных.
Короеды это не жуки. Это пользователи. Они едят кору головного мозга ...
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!