Ограничение накладных расходов ColdFusion GC при циклическом выполнении API Json Response - PullRequest
2 голосов
/ 05 апреля 2019

Для начала я понимаю, что вообще означает ошибка «Ограничение накладных расходов GC». Я получил это сообщение во время выполнения скрипта, который выполняет следующее:

  1. Создание экземпляра объекта, который отправляет запрос CFHTTP GET на внешний API
  2. Сохранить ответ JSON (массив) как свойство объекта Instance (т.е. VARIABLES.data)
  3. Цикл по массиву ответов JSON с использованием for in loop
  4. Создание экземпляра для объекта, который вызывает хранимую процедуру SQL Server, передавая свойства объекта JSON (хранимая процедура SQL выполняет и UPDATE или INSERT, основываясь на существовании записи для ключа объекта)

Вывод отладки показывает, что вызов SP занимает от 3 до 12 миллисекунд.

Когда я запускаю этот сценарий с ограниченным набором данных (~ 3000 записей), он запускается до завершения без исключения GC.

Когда я запускаю сценарий с полным набором данных (~ 14 000 записей), генерируется исключение GC.

Вот мой псевдокод:

    for (LOCAL.WidgetJson in VARIABLES.data) {
        LOCAL.Widget=new Widget();
        LOCAL.Widget
            .save(argumentCollection=LOCAL.WidgetJson);
    }

Widget.cfc:

private void function saveStoredProc() {
    cfstoredproc(procedure="SaveWidget") {
        cfprocparam(
            dbvarname="@id",
            type="in",
            cfsqltype="CF_SQL_INT",
            value=VARIABLES.id
            );
        <!--- Rest of cfprocparam() tags here --->
}

private void function save() {
    for (LOCAL.Property in ARGUMENTS) {
        if  (StructKeyExists(ARGUMENTS, LOCAL.Property)) {
            if  (IsSimpleValue(ARGUMENTS[LOCAL.Property])) {
                VARIABLES[LOCAL.Property] = Trim(ARGUMENTS[LOCAL.Property]);
            }
            else {
                VARIABLES[LOCAL.Property] = ARGUMENTS[LOCAL.Property];
            }
        }
    }

    saveStoredProc();
}

Мне интересно, можно ли улучшить способ создания объектов или циклов, чтобы исключить GC-исключения / утечки памяти.

Есть идеи по улучшению?

1 Ответ

0 голосов
/ 08 апреля 2019

Я не думаю, что сборка мусора будет происходить во время одного запроса, даже если это необходимо.Вы можете увеличить объем памяти или разбить ее на несколько потоков, которые обрабатывают меньшие объемы данных.

...