У нас есть скрипт ColdFusion 9, который регулярно выполняет чтение файла CSV и вставку записей в базу данных Oracle 11g. Файл CSV содержит около 50 столбцов, 8 из которых используются CF (формат CSV не может быть изменен). Общий поток ОВЛХ:
- Считать файл в переменную
- CFLOOP, используя эту переменную в качестве атрибута списка с CHR (13) в качестве разделителя
- Вызвать хранимую процедуру Oracle, вставляя различные значения из файла, используя ListGetAt
Хранимая процедура выполняет следующие действия:
- Вставляет запись с 2 полями в таблицу 1
- Вставляет запись с 8 полями (включая первичный ключ таблицы 1) в таблицу 2
- ничего не возвращает
В большинстве случаев это работает успешно, считывая файлы размером 400 КБ с сотнями записей всего за пару секунд. Тем не менее, иногда мы получаем большой объем и в результате получаем 13 КБ записи размером 5 МБ. Когда мы пытаемся обработать такой большой файл, я наблюдаю, как использование памяти JVM меняется с 90 МБ до 680 МБ в течение 10-15 секунд, после чего монитор сервера CF перестает отвечать (как и CF), заставляя нас перезапустить службу. Журналы сообщают об ошибке нехватки памяти JVM:
"Ошибка", "qtp4795249-38798", "28.12.11", "16:29:20" ,, "Превышен лимит накладных расходов ГХ"
java.lang.OutOfMemoryError: превышен лимит накладных расходов GC
Наш размер кучи JVM в настоящее время составляет 768 МБ. Я не пытался увеличить его, так как даже если это действительно решит эту проблему, это не защитит нас в будущем, а остальная часть обычной нагрузки на сервер не требует почти так много. И я не решаюсь слишком много играть с настройками JVM, которые требуют перезапуска, чтобы вступить в силу на рабочей коробке.
Это сложно проверить, так как процесс импорта работает нормально с едва заметной загрузкой памяти на моем локальном компьютере разработчика и на нашей машине QA, но оба из них имеют гораздо более медленное соединение с базой данных и занимают 10-15 минут, чтобы полный.
Буду признателен за любые мысли, особенно о том, куда идет память. Я не могу понять, как 5 МБ данных превращаются в 700 МБ данных. У нас действительно включена отладочная информация, но IP-адрес вызывающего скрипта отсутствует в списке отладки, и я использовал тег cfsetting, чтобы отключить отладку для этой страницы. Ранее был этап 1.5, который превратил данные CSV в запрос ColdFusion, но я устранил это в попытке повысить эффективность. Оба способа приводят к ошибке OOM.