Страницы: 1 2 След.
RSS
Как ускорить вывод данных из массива на лист
 
Доброго всем времени суток!
Нужен коллективный разум - стрелкам осциллографа не беспокоится...
Массивы в памяти обрабатываются быстро - но вот с выводом беда
Можно ли, каким либо образом поправить положение - ускорить вывод данных?

Какие есть идеи, предложения,  думы, способы и механизмы?
Код
'1)время обработки данных
    T1 = Timer
    T3 = T1 - t
'    2)вывод на лист
Application.ScreenUpdating = False 'Выключаем обновление экрана'
MsgBox "Обработка данных - " & T3 & "cek"
   With Sheets("Sheet1")
'        Set Cel = .Cells(Rows.Count, 1).End(xlUp).Offset(1)
        .Cells(6, 1).Resize(K, Col).Value = Result ' Вывод данных из массива на лист
   End With
Application.ScreenUpdating = True 'Выключаем обновление экрана'
   T2 = Timer - T1
'   информация о времени работы.
   MsgBox "Вывод на лист - " & T2 & "cek" & Chr(10) , , "Проверка на скорость"

Гонял на такой конфигурации - Win7 32, ОЗУ 4гб, Xeon E5450 3.40 ГГЦ, видяха GTS 250 1 Гб шина 256 bit
3 раза запускал алгоритм на 100 000 строк.
Расчетная часть отрабатывает за 3.8 сек - тут проблем нет.
Но вот с выводом данных на экран беда - лопатит больше 20 мин., ни разу не дождался...)))
Причем система загружена на 25 процентов всего, Excel в ОЗУ занимает 800 Мб...
Решил спуститься пониже - на 50 000 строк.
Расчетная часть отработала за 2.01 сек - нормально.
Вывод данных - 1094 сек

Сейчас прогнал на более мощном.
Конфигурация такая -Win10 64, OЗУ 8гб, i5-7500 3.4 ГГЦ, видяха встроенная HD Graphics 630.
на 10 000строк - обработка данных - 0,218 сек, вывод данных - 17 сек
на 50 000 строк - обработка данных - 1 сек., вывод данных на экран - 660 сек.
на 100 000 строк - обработка данных-2,01 сек, вывод данных на экран - 2435 сек.
То есть обработка на высоте, с выводом беда.
Обработка данных - зависимость просто линейная.
Вывод данных - прямо таки настоящая экспонента...)))
Вот как то вот так...)))
Изменено: Джек Восмеркин - 16.04.2019 11:28:24
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Цитата
Джек Восмеркин написал:
стрелкам осциллографа не беспокоится
Это Вы о чём?
По вопросу: нет ли на листе, куда выгружается массив, процедуры Worksheet_Change? Если есть - отключите ещё и отслеживание событий.
 
Еще возможная причина - пересчет формул
 
Пересчета формул и процедуры Worksheet_Change на листе нет.
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Что-то еще есть.
Какой объем выводимых данных?
Условное форматирование. Именованные диапазоны. Связи с другими книгами.
 
Цитата
Джек Восмеркин написал: на листе нет.
А аналогичная процедура в модуле книги?
 
Лист свежий, чистый - только перенес туда код.
Диспетчер имен чистый.

Прошу прощения - 100 000 строк - это входные данные.
Выходные данные, которые идут на лист(кол-во строк*2) - 200 000 строк.
В каждой строке 47 ячеек.
Изменено: Джек Восмеркин - 16.04.2019 12:21:08
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Код
Application.ScreenUpdating = False 'Выключаем обновление экрана'
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
   With Sheets("Sheet1")
        .Cells(6, 1).Resize(K, Col).Value = Result ' Вывод результирующего массива на лист
   End With
Application.ScreenUpdating = True 'Выключаем обновление экрана'
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True

Товарищи -руль покрутил, по колесу постучал, стекло протер...
Но каменная чаша так и не вышла...)))
Лист, на который идет вывод - чистейший,  именованных диапазонов нет, ни формул ни форматирования нет.
Может есть не очень традиционные методы борьбы???

Ячеек вставляется много - 200 000 х 47...
Но не полчаса же их вставлять...)))
Изменено: Джек Восмеркин - 16.04.2019 15:09:13
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Подготовил данные: 200 000 строк на 47 столбцов. Во всех ячейках число 100. Забираю в массив и тут же выгружаю его на другой лист. Результат  0,03125  
 
Цитата
Джек Восмеркин написал:
Но не полчаса же их вставлять...)))
смотря какую цель Вы преследуете
если нужно показать заказчику, какой мощный макрос Вы написали и как он тужится над расчетами заполняя данными 200тыс х 47 ячеек можно и полчаса... (я обычно в это время стою рядом и важно надуваю щеки, чтобы придать значимости всему происходящему)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
ну и ко всем прочим замечаниям: зачем отдельные переменные для ресайза, если можно ресайзить точно по границам массива??? Sheets("Sheet1").Cells(6, 1).Resize(UBound(Result,1), UBound(Result,2)).Value = Result
Цитата
Джек Восмеркин: Но не полчаса же их вставлять...)))
а вы можете и дальше файл-пример не показывать и гадать — тоже вариант
Изменено: Jack Famous - 16.04.2019 15:49:02
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал: зачем отдельные переменные для ресайза
Не всегда нужно выводить весь массив. Пример: заранее размер массива определить затруднительно, размерности задаются с запасом.
 
vikttur, я это знаю))) и это, наверное, единственный логически обоснованный вариант. Однако, если человек создаёт тему "Как ускорить вывод данных из массива на лист" (когда это одна операция и можно её только "замедлить", выводя в цикле), то хотелось бы узнать его версию  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Извините, надо было сразу...
Файл большой не пролезет - какой есть.
Можете сами добавить строки, хотя бы 10 000 строк - посмотрите.
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Цитата
Джек Восмеркин: Worksheet_Change на листе нет
зато есть Worksheet_Activate  — без неё выводит мгновенно  :D

В модуле листа «Sheet 1» (на который выводится)
Исполнительный макрос
коды привёл, чтобы остальным можно было тут посмотреть и не лезть в файл
Изменено: Jack Famous - 16.04.2019 18:17:54
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Убрал Worksheet_Activate() и в кнопке - UsedRange.Offset(5).EntireRow.Delete
Прогнал.
Входной массив - 110 000 строк.
Выходной массив - 220 000 строк, 47 столбцов....
Обработка данных - 4.27 сек
Вывод данных - 1671 сек.
Ускорение примерно в 2 раза

Можно еще снизить время вывода?
Великий и могучий утес, сверкающий бой, с ногой на небе, живущий, пока не исчезнут машины.
 
Может комп поменять?
Код
Sub qq()
    Dim ar(1 To 200000, 1 To 47), t!, i&, j&
    For i = 1 To 200000
        For j = 1 To 47
            ar(i, j) = Rnd
        Next
    Next
    t = Timer
    [a1].Resize(UBound(ar), UBound(ar, 2)).Value = ar
    Debug.Print Format(Timer - t, "0.0000")
End Sub

41 сек
Комп 2 ядра, 32 система
PS на момент выполнения занято 70% памяти
Изменено: RAN - 16.04.2019 20:06:43
 
Прогнал тест из #17 на новой книге - 10 сек. Крайне маловероятно, что проблема (1600 сек) в компьютере.

Уважаемый  Джек Восмеркин, попробуйте сделать следующее:
  • перезагрузите Windows
  • откройте Excel и убедитесь (Alt+F11), что не открыты никакие надстройки и личная книга макросов
  • в новую книгу добавьте макрос Андрея #17 и выполните его
  • опубликуйте  результат
Владимир
 
У меня код из #17 показал 8 секунд.
 
Юра, хороша машинка. У меня 31 сек.
 
Да откуда хорошая? Когда сломалась старая - брал самый бюджетный вариант ))
 
RAN, Андрей, не позорь зверей :-) , в одном случае только числа в другом текст, и это не 10 байтов. :-)
Очень неловко медведю по ушам Макрушникам ездить, собственно дело тут не в макросах,
100к строк -  результат в оригинальном файле ужасен, устал ждать и даже не записал, а вот после изменения внесенного
Обработка данных - 4,953125cek
Вывод на лист - 17cek
всего - 21,95313
Изменил только формат ячеек на листе Sheet1, убрав Wrap Text.  Думаю понятно сколько ресурсов бедняге было надо почти все эти строки обработать и расширить по высоте.
Изменено: БМВ - 16.04.2019 20:44:46
По вопросам из тем форума, личку не читаю.
 
А я не помню уже когда и где брал свой :)
2 ядра, AMD PhenomII X2 555 3.20 Ггц, виндовый индекс производительности 6,6
Изменено: Hugo - 16.04.2019 20:45:35
 
4 ядра, 3,5ГГц. Intel Pentium  CPU G4560.  64-разрядная. Win 10.
 
Цитата
БМВ написал:
Изменил только формат ячеек на листе Sheet1, убрав Wrap Text.
И как это связано с временем выгрузки?
Можно еще и уф покруче для каждой ячейки добавить.
 
Цитата
Hugo написал:
виндовый индекс производительности 6,6
переходите на win10, там нет этого индекса :-) спокойнее себя чувствуешь на любой машине :-)

Цитата
RAN написал:
И как это связано с временем выгрузки?
результат налицо, а вот как связано - ну наверно просто идет форматирование, которого не видим, но оно есть.
По вопросам из тем форума, личку не читаю.
 
Суслика видишь?
Цитата
БМВ написал:
не видим, но оно есть.
:)
 
Цитата
Hugo написал:
2 ядра, AMD PhenomII X2 555 3.20 Ггц, виндовый индекс производительности 6,6
Ты крут, паря!  8)
 
RAN, в данном случае звучит лучше так
не видим, но оно ест, даже можно сказать жрет ресурс.
Посмотрим что ТС скажет.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
переходите на win10
- была у меня законная Windows 10 Insider Preview - но рухнула без возможности восстановления, уж не знаю что там понаобновлялось... Отформатировал диск и вернулся на семёрку.
Страницы: 1 2 След.
Наверх