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.

El uso del C-Stack está demasiado cerca del límite, no debido a código recursivo.

Tengo una pregunta intrigante y no puedo encontrar la respuesta. Tengo una función específica de Python que ejecuta un script de SQL, obtiene los datos y los transforma en un pd.DataFrame. El tamaño de una respuesta típica es de alrededor de 100 KB (83.9 KB en el ejemplo a continuación):

Cuando ejecuto la misma función exacta, que importo en una sesión de R usando reticulate, obtengo un error de “C Stack usage too close to the limit”.

No entiendo por qué R me da una respuesta así para un dataframe tan pequeño. ¿Tiene que ver con la traducción del código de Python a R a través de reticulate? Una pregunta bastante específica, pero me gustaría saber si alguien sabe la respuesta.

Por favor, vea el código de la función de Python a continuación:

def get_raw_data_(make, year):

    sql_file = WORKING_DIRECTORY.joinpath("sql/get_raw_data.sql")
    sql_string = sql_script_to_string(sql_file)

    dragend_rules_file = WORKING_DIRECTORY.joinpath(f'sql/dragend_rules/{make}.sql')
    dragend_rules = sql_script_to_string(dragend_rules_file)

    tellend_rules_file = WORKING_DIRECTORY.joinpath(f'sql/tellend_rules/{make}.sql')
    tellend_rules = sql_script_to_string(tellend_rules_file)

    to_replace = {
        'INSERT_YEAR':year,
        'INSERT_DRAGEND_RULES':dragend_rules,
        'INSERT_TELLEND_RULES':tellend_rules
    }

    for key, value in to_replace.items():
        sql_string = sql_string.replace(key,value)

    sql_string = sql_string.replace('INSERT_MAKE', make)

    res = execute_sql(sql_string, cur)
    res = pd.DataFrame(res, columns = [
        "CONTRACTNR", "MAKE", "TYPE", 
        "VEHICLEKIND", "STATUS", "LICENSEPLATE",
        "FUELTYPE", "COMMERCIALUNITLEVEL1", "YEARMONTHREGISTRATION",
        "DRAGEND"
    ])

    res = res.reset_index(drop=True)
    cols_fact = res.columns[~res.columns.isin(['CONTRACTNR', 'YEARMONTHREGISTRATION'])]
    res[cols_fact] = res[cols_fact].astype('category')

    return res

Llamo a esta función en R de la siguiente manera:

source('get_raw_data.py')
get_raw_data_('ME', '2021')
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es posible que el error que estás recibiendo en R esté relacionado con la traducción del código de Python a R del paquete “reticulate”. Sin embargo, también es posible que el error esté relacionado con los límites de memoria de tu sistema o de la sesión de R.

    Una posible solución que podrías intentar es ajustar los límites de memoria de tu sesión de R utilizando el comando “ulimit”. Por ejemplo, podrías intentar aumentar el límite del tamaño de la pila utilizando “ulimit -s unlimited”.

    Además, es posible que desees verificar si hay objetos grandes o estructuras de datos en tu sesión de R que puedan contribuir al uso de memoria. Podrías intentar eliminar objetos innecesarios utilizando la función “rm()” o utilizar la función “gc()” para activar la recolección de basura.

    Otra posible solución a considerar sería utilizar fragmentación o paginación en tu consulta de SQL para limitar la cantidad de datos que se devuelven y procesan en un momento dado. Esto podría ayudar a reducir el uso de memoria y evitar posibles errores relacionados con los límites de memoria.

    En general, sería útil investigar más a fondo la fuente del error revisando los registros del sistema o ejecutando diagnósticos adicionales de memoria para identificar cualquier problema potencial con tu sistema o sesión de R.

Comments are closed.