Обходной путь для утечки памяти при использовании большой строки - PullRequest
0 голосов
/ 18 сентября 2018

Следующий простой код копирует некоторые ячейки в буфер обмена и возвращает их в виде текстовых данных.Позже эти данные будут размещены во внутреннем веб-сервисе, но на данный момент это закомментировано.Каждый раз, когда я запускаю скрипт, используемая память Excel увеличивается примерно на 80 МБ (в два раза больше размера строки).Я понятия не имею, где / почему не работает сборщик мусора и что я могу сделать снова.

Sub memory_leak()
    Dim DataObj As New MSForms.DataObject
    Dim data As String

    'Copy Data Range ~ the first 250.000 rows / 22 columns
    Range(Cells(9, 1), Cells(250000, 22)).Copy

    DataObj.GetFromClipboard
    data = DataObj.GetText

    ' Call postToURL("http://intranet/API.php?action=test", data)

    'Try to free memory...
    Application.CutCopyMode = False
    DataObj.Clear
    data = ""
End Sub

1 Ответ

0 голосов
/ 19 сентября 2018

Коренная причина не в обработке больших строк.Проблема заключается в вызове метода MSForms.DataObj.GetText, который не освобождает память правильно.Доступ к буферу обмена может быть альтернативно сделан через собственные API Windows.На этом сайте http://access.mvps.org/access/api/api0049.htm показан пример реализации, которая отлично работает в моих тестах, даже если она на ~ 30% медленнее, чем метод, предоставляемый MSForms.

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