es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Proc SQL se está quedando sin memoria.

Tengo un conjunto de datos que tiene aproximadamente 8,000 variables y 100,000 filas. Actualmente tengo una declaración Proc SQL que crea una tabla que tiene el recuento de las filas y las sumas de 5,500 columnas diferentes que son binarias. Ejemplo:

Crear tabla Nueva_Tabla como
Seleccionar Count(*) como CNT
,SUM(Columna1) como Columna1
,SUM(Columna2) como Columna2
….
,Sum(Columna5500) como Columna5500
Desde Tabla

Estoy obteniendo este error:

ERROR: no se pudo obtener memoria para el procesamiento de la cláusula WHERE.

Creo que esto se debe a que SAS alcanza un límite de memoria. No tengo acceso al archivo de configuración para ajustar el tamaño de la memoria.

Aquí están las preocupaciones que tengo:
1. Necesito que esta declaración se ejecute en una sola instrucción, pero no necesariamente en Proc SQL. El proceso que utiliza este código SQL requiere que se sumen diferentes columnas cada vez. Dividirlo complicará otras partes del proceso.
2. El código se está generando un error con 8 GB de memoria. El archivo solo tiene 475 MB y para sumar 5500 variables, cada variable está ocupando más de 10 MB de memoria para sumar. ¿Hay alguna forma de controlar la cantidad de memoria que se utiliza para cada variable?
3. ¿Existe alguna documentación sobre cómo SAS localiza la memoria durante el procesamiento?

Tags:  ,

Answer

  1. Avatar for davy.ai
    1. Si no puedes ajustar el tamaño de memoria a través del archivo de configuración, puedes intentar agregar la instrucción “OPTIONS MEMSIZE=” al principio de tu código SAS para asignar más memoria a tu sesión. También puedes intentar utilizar la sintaxis “PROC SQL; QUIT;” para evitar problemas de memoria dentro de una sola instrucción. Luego puedes incluir tu declaración Proc SQL dentro de una macro y crear una variable macro que contenga la lista deseada de columnas a sumar. De esta manera, puedes cambiar fácilmente la lista de columnas a sumar sin necesidad de reescribir toda la declaración Proc SQL.

    2. Cuando sumas variables binarias, SAS puede tratarlas como variables numéricas en lugar de binarias. Las variables numéricas en SAS requieren más memoria para almacenar que las variables binarias. Puedes intentar convertir las variables binarias a variables numéricas antes de sumarlas para disminuir la cantidad de memoria requerida. Puedes hacer esto utilizando la instrucción INPUT seguida de la instrucción SUM, por ejemplo:

    PROC SQL;
    CREATE TABLE Nueva_Tabla AS
    SELECT COUNT(*) AS CNT,
           SUM(INPUT(Columna1, 1.)) AS Columna1_numerica,
           SUM(INPUT(Columna2, 1.)) AS Columna2_numerica,
           ...
           SUM(INPUT(Columna5500, 1.)) AS Columna5500_numerica
    FROM Tabla;
    QUIT;
    
    1. SAS tiene un Administrador de Memoria que asigna y libera memoria de forma dinámica según los requisitos del programa. Cuando se ejecuta un programa SAS, el Administrador de Memoria solicita memoria libre al sistema operativo, que luego se utiliza para almacenar datos e instrucciones del programa. Si SAS se queda sin memoria, puede intercambiar algunos de los datos o instrucciones del programa al disco, lo que puede hacer que el programa se ejecute más lento. La documentación de SAS proporciona más información sobre el Administrador de Memoria y cómo funciona.

Comments are closed.