Ошибка памяти вне процесса при записи большого xml-файла с помощью oracle xmldb
Мы столкнулись с проблемой написания большого xml-файла с помощью утилиты oracle 9i xmldb. Запрос генерирует около 3 миллионов строк, и oracle отвечает следующим сообщением об ошибке:
ERROR at line 1:
ORA-04030: out of process memory when trying to allocate 4012 bytes
(qmxtgCreateBuf,kghsseg: kolaslCreateCtx)
ORA-06512: at "....", line 1154
ORA-06512: at line 1
ERROR:
ORA-00600: internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s],
[%s], [%s]
В журнале оповещений:
Errors in file d:/db/admin/acc1/udump/acc1_ora_8112.trc:
ORA-00600: internal error code, arguments: [729], [104], [space leak], [], [], [], [], []
Мы пытались увеличить память процесса, но это вряд ли имеет какой-либо эффект.
Есть ли способ заставить оракула использовать меньше памяти для xml ("ленивый манифест" / переключатель записи или что-то в этом роде?
1 ответ
Вы должны управлять памятью, используемой процессом, используя BULK
операция и LIMITED PAGED
запросы
Например:
DECLARE
CURSOR c_customer IS
SELECT CUSTOMER.id, CUSTOMER.name from CUSTOMER;
TYPE customer_array_type IS TABLE OF c_customer%ROWTYPE INDEX BY BINARY_INTEGER;
customer_array customer_array_type;
fetch_size NUMBER := 5000; -- scale the value to manage memory
BEGIN
-- Open(create) XML file
OPEN c_customer;
loop
FETCH c_customer BULK COLLECT
INTO customer_array LIMIT fetch_size;
FOR i IN 1 .. customer_array.COUNT LOOP
null; -- Add XML nodes
END LOOP;
EXIT WHEN c_customer%NOTFOUND;
END LOOP;
CLOSE c_customer;
-- Close(flush) XML file
End;
В некоторых случаях, когда размер файла превысит пределы размера файла ОС, вам придется создать несколько файлов.