powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ускорить заполнение экземпляров класса данными
4 сообщений из 4, страница 1 из 1
Ускорить заполнение экземпляров класса данными
    #39574606
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Во вложенном excel-ом файле на вкладке "Исходные данные" присутствуют данные, которые получены с помощью выгрузки. Задача такая, что из этих данных нужно получить уникальный список экземпляров класса (ТТ+SKU+ДатаНачала+ДатаОкончания), и потом раскидать данные по соответствующим экземплярам класса. Далее по каждому экземпляру происходят цепные расчеты по дням. В данном примере цепные расчеты не приведены и в коде в классе отсутствуют свойства для результатов. В общем, код написан, код работает. Но есть но.

1. Мне кажется что я не совсем правильно написал код. Потому что, если 500 000 строк, то долго считывает, потом для заполнения каждого экземпляра класса нужно пробегаться по всем строкам, и если находит берет данные с текущей строки и вставляет в соответствующие экземпляры. Потом долго происходит цепные расчеты в каждом экземпляре, хотя это другой вопрос. Можно ли как оптимизировать считывание данных с листа, поиск уникальных, создание экземпляров классов и заполнение их по определенной логике, чтобы быстрее работало?

2. После того, как созданы и заполнены все экземпляры классов, но до цепных расчетов, то есть необходимость сохранять сами экземпляры с данными в каком то формате. Чтобы потом заново не считывать с листа, а выгрузить с того файла, где данные не просто как реляционная таблица, а как экземпляры класса. И после проведения цепных расчетов в этом файле заполняются результаты расчетов. Это возможно как то сделать? Есть такой формат данных?

Не обращайте внимание, что переменные на русском языке, это чтобы код был легок в понимании.
...
Рейтинг: 0 / 0
Ускорить заполнение экземпляров класса данными
    #39574653
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

пути ускорения :
1. Закинуть Range в массив и дальше выполнять итерации по массиву, а не по листу.
2. Закинуть 500 000 строк в mdb , повесить ключ для отбора уникальных записей и работать через KeySet Recordset.
...
Рейтинг: 0 / 0
Ускорить заполнение экземпляров класса данными
    #39574665
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikkМожно ли как оптимизировать считывание данных с листа, поиск уникальных,
Есть средство удаления дубликатов. Запусти его вручную под запись, получишь код, который стопудово будет эффективнее твоего.
ferzmikkвыгрузить с того файла, где данные не просто как реляционная таблица, а как экземпляры класса. И после проведения цепных расчетов в этом файле заполняются результаты расчетов. Это возможно как то сделать? Есть такой формат данных?Выгрузить объекты в файл As Binary, и загрузить из файла...
...
Рейтинг: 0 / 0
Ускорить заполнение экземпляров класса данными
    #39574784
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
если речь идет об оптимизации, то хранение данных в экземпляре класса противопоказано. И если уж делать так, то не использовать процедуры Property Get и Property Let, а просто объявить переменные класса как Public.
Вот сравнение времени доступа к переменным класса через Property, напрямую, а также к аналогичной переменной пользовательского типа и к локальной переменной.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
'код класса Данные - изменить

Public mДата As Date

'код нового модуля

Type tДанные
  mДата As Date
End Type

Sub test()
Const N = 5000000
Dim d As Date, d1 As Date, j&, t!, cls As Данные, typ As tДанные
  Set cls = New Данные
  d = Now
  DoEvents: t = Timer
  For j = 1 To N
  Next
  Debug.Print "warm-up", Timer - t
  
  DoEvents: t = Timer
  For j = 1 To N
    cls.Дата = d
    d = cls.Дата
  Next
  Debug.Print "class prop.", Timer - t
  
  DoEvents: t = Timer
  For j = 1 To N
    cls.mДата = d
    d = cls.mДата
  Next
  Debug.Print "class public", Timer - t

  DoEvents: t = Timer
  For j = 1 To N
    typ.mДата = d
    d = typ.mДата
  Next
  Debug.Print "type", Timer - t
  
  DoEvents: t = Timer
  For j = 1 To N
    d1 = d
    d = d1
  Next
  Debug.Print "local var", Timer - t
End Sub

Мои результаты:
Код: plaintext
1.
2.
3.
4.
5.
warm-up        0,109375 
class prop.    2,4375 
class public   0,453125 
type           0,203125 
local var      0,234375 
Доступ к переменной класса напрямую в 5 раз быстрее, чем через Property, а доступ к переменной из пользовательского типа еще в 2 раза быстрее.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Ускорить заполнение экземпляров класса данными
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]