ORE – Memory exhausted
Lors de la construction de l’ANN du billet précédent, j’ai rencontré plusieurs problèmes de saturation mémoire du processus R lancé via extproc. ORE offre la possibilité de contrôler la mémoire utilisé par un moteur R instancié.
Les valeurs limites sont accessibles via le vue RQ_CONFIG:
SYS@HODBA04D1_1 [PDB_HODBA08] > select name, value from sys.rq_config; NAME VALUE ------------ -------------------------------------------------- R_HOME /usr/lib64/R R_LIBS_USER /soft/oracle/product/rdbms/12.2.0.1/R/library VERSION 1.5 MIN_VSIZE 32M MAX_VSIZE 4G MIN_NSIZE 2M MAX_NSIZE 20M 7 rows selected. SYS@HODBA04D1_1 [PDB_HODBA08] >
Les deux valeurs importantes MAX_VSIZE et MAX_NSIZE – ces dernières correspondent à la mémoire maximale allouable pour les Vcells (MAX_VSIZE) et pour les Ncells (MAX_NSIZE). Lorsqu’un moteur R embarqué atteint une de ces limites, l’appel échoue avec un message :
- « Error : vector memory exhausted (limit reached?) » lorsque MAX_VSIZE est atteint:
Error in .oci.GetQuery(conn, statement, data = data, prefetch = prefetch, : ORA-20000: RQuery error Error : vector memory exhausted (limit reached?) ORA-06512: at "RQSYS.RQEVALIMPL", line 104 ORA-06512: at "RQSYS.RQEVALIMPL", line 101
- « Error : cons memory exhausted (limit reached?) » lorsque MAX_NSIZE est atteint:
Error in .oci.GetQuery(conn, statement, data = data, prefetch = prefetch, : ORA-20000: RQuery error Error : cons memory exhausted (limit reached?) ORA-06512: at "RQSYS.RQEVALIMPL", line 104 ORA-06512: at "RQSYS.RQEVALIMPL", line 101
Il convient alors d’augmenter la limite concernée à l’aide de la procédure RQCONFIGSET. Ici, j’augmente la mémoire maximale utilisable pour les Vcells à 32GB:
SYS@HODBA04D1_1 [PDB_HODBA08] > begin sys.rqconfigset('MAX_VSIZE', '32G');
2 end;
3 /
PL/SQL procedure successfully completed.
SYS@HODBA04D1_1 [PDB_HODBA08] >
En revanche, pour les Ncells, la limite est exprimée en nombre de « cellules ». Chaque cellule représentant 56 bytes sur un système x64. Ici, j’augmente la mémoire utilisable pour les Ncells à 5.6GB (56 bytes * 100M):
SYS@HODBA04D1_1 [CDB$ROOT] > begin sys.rqconfigset('MAX_NSIZE','100M');
2 end;
3 /
PL/SQL procedure successfully completed.
SYS@HODBA04D1_1 [CDB$ROOT] >
L’état mémoire d’un moteur R est accessible via la commande gc. On constate bien ici que les limites correspondent à celles ajustées précédemment:
> ore.doEval(gc)
used (Mb) gc trigger (Mb) limit (Mb) max used (Mb)
Ncells 220849 11.8 1677721 89.6 5600 350000 18.7
Vcells 409436 3.2 26843545 204.8 32768 786408 6.0
>