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
>

 

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

twenty six + = thirty five