2013-09-15 3 views
0

У меня есть файл excel, размер которого равен только 1 МБ, но неограниченно увеличивает объем памяти (выше 6 ГБ), пока он не работает.Файл Excel использует накопительную память

Лист состоит из 100 независимых строк с примерно 300 столбцами каждый, где он извлекает данные из надстройки и выполняет вычисления. В excel есть VBA, который подключается к локальной БД доступа, чтобы вытащить 10 000 идентификаторов, которые затем проходят через них по группам по 100 за раз, извлекает данные из надстройки (используя UDF), а затем переходит к следующим 100.

Он делает следующие шаги: 1) Вытяните список из 10 000 уникальных 8-символьных идентификаторов из БД доступа, вставляет их в Sheet2 (не используется ни для чего другого) - эта часть не использует много памяти 2) В VBA - начиная с вершины, он прокручивается в блоках по 100 идентификаторов за один раз, копирует их в позиции A1: A100 в Sheet1 с 300 столбцами ссылки на UDF и вычислениями в ID в columb A для каждой строки 3) Вычисляет лист для вывода новых данных из UDF для каждого столбца

Это, кажется, только добавляет к использованию памяти каждый раз, когда он запускается, даже если предыдущий блок из 100 идентификаторов ушел (я сделал это так, потому что он, казалось, разбился, если я сделал 10 000 всех сразу). Книга предназначена для расчета РУЧНОЙ (следовательно, шаг 3); и все объекты устанавливаются в значение = Ничего, однажды сделанное для копирования информации БД.

Как остановить использование памяти из-за накопления? Кажется, это связано с тем, что UDF не освобождает память после того, как они были запущены. Есть ли способ очистить кеш в Excel или сбросить его с помощью VBA после каждого блока из 100 идентификаторов?

+1

Трудно делать какие-либо предложения без фактического кода. –

+0

будет ли это надстройкой, которая потребляет все больше и больше памяти? любые настройки для этого надстройки для ограничения использования? или метод очистки его памяти? – PatricK

ответ

0

Я согласен с Тимом Уильямсом, недостаточно информации, приведенной в описании, чтобы фактически ответили на вопрос. Тем не менее, я бы рискнул предположить, что это VBA memory leak. (В случае, если вы не знакомы с утечками памяти, here is Wikipedia's article)

Я обнаружил несколько вещей, которые причинили увеличение памяти, похожее на то, что вы описали:

  1. Как отмечается в статье, VBA Garbage Collecter учитывает только количество ссылок, поэтому два элемента, которые ссылаются друг на друга, будут оставаться в памяти неограниченно долго. Чтобы исправить это, убедитесь, что вы явно указали ссылки на Nothing.

  2. Другое, что я видел, это COM-объекты, которые должны быть явно выпущены методом .Close или .Quit.

Это, как говорится, если вы можете обеспечить даже грубый псевдокод контур основного цикла кода, который будет идти долгий путь к помогать людям на этом сайте помочь вам :)

0

Если вы сохраните файл «ActiveWorkbook.Save» после нескольких итераций, он очистит кэш памяти для вас, и он будет продолжаться, как если бы вы сохранили, закрыли и снова открыли файл, не тратя много времени.

Смежные вопросы