Почему требуется так много времени, чтобы повторно выпустить / очистить 100 000 объектов в Excel-VBA? - PullRequest
0 голосов
/ 26 мая 2020

Основная цель: я пытаюсь хранить и манипулировать "БОЛЕЕ 90000!" товары в памяти из файла csv (одна строка, один товар).

Для каждого продукта я создаю объект. Этот объект имеет несколько строковых и целочисленных полей:

Option Explicit

Private m_name As String
Private m_price As Integer
Private m_description As String
Private m_amount As Integer


Property Get name() As String
    name = m_name
End Property
Property Let name(value As String)
    m_name = value
End Property

Property Get price() As Integer
    price = m_price
End Property
Property Let price(value As Integer)
    m_price = value
End Property

Property Get description() As String
    description = m_description
End Property
Property Let description(value As String)
    m_description = value
End Property

Property Get amount() As Integer
    amount = m_amount
End Property
Property Let amount(value As Integer)
    m_amount = value
End Property

Проблема: создать этот объект относительно быстро, но требуется много времени, чтобы очистить / освободить их, либо с помощью set = nothing, либо просто в конец суб. Вот фрагмент тестового кода, который подсчитывает время, затраченное на прецессию:

Option Explicit

'64 bit Version with "PtrSafe"
Public Declare PtrSafe Function GetTickCount Lib "kernel32.dll" () As Long

Sub TestSub()

    Dim t As Long
    t = GetTickCount
    'Start test code.

    TestFunction

    'End test code.
    Debug.Print GetTickCount - t, , "To delete"

End Sub




Sub TestFunction()

    Dim t As Long
    t = GetTickCount
    'Start test code.

    Dim testArray(99999) As TestProduct
    Dim i As Long
    Dim product As TestProduct

    For i = 0 To 99999
        Set testArray(i) = New TestProduct
    Next

    'End test code.
    Debug.Print GetTickCount - t, , "To create"

End Sub

Вывод (миллисекунды):

235                        To create
7250                       To delete

Как видите, для освобождения файла требуется почти 8 секунд. память в конце функции / подп. Я получаю тот же результат, когда использую этот код Redim testArray(0) для очистки массива.

Есть ли лучший способ сохранить эту информацию в памяти? Может быть, с массивами или ADODB.recordset? Я использую ADODB.Stream для построчного чтения CSV-файла в кодировке UTF-8 и хранения информации в объектах.

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...