Soy nuevo en MATLAB, no estaba en la descripción del trabajo y me he visto obligado a reemplazar a la persona que escribió y mantuvo el código que usa mi empresa. La vida es dura¿Conservo memoria en MATLAB declarando las variables globales en lugar de pasarlas como argumentos?
El chico del que estoy tomando el control me dijo que declaró todos los vectores de big data como global
, para ahorrar memoria. Más específicamente, de modo que cuando una función llama a otra función, no crea una copia de los datos cuando la pasa.
¿Es esto cierto? He leído Strategies for Efficient Use of Memory, y se dice que
Cuando se trabaja con grandes conjuntos de datos, tenga en cuenta que MATLAB hace una copia temporal de una variable de entrada si la función llamada modifica su valor. Esto duplica temporalmente la memoria requerida para almacenar la matriz, lo que hace que MATLAB genere un error si no hay suficiente memoria disponible.
Dice algo muy similar en Memory Allocation For Array #Function Arguments:
Cuando se pasa una variable a una función, que están pasando en realidad una referencia a los datos que representa la variable. Siempre que los datos de entrada no sean modificados por la función a la que se llama, la variable en la función de llamada y la variable en la función llamada apuntan a la misma ubicación en la memoria. Si la función llamada modifica el valor de los datos de entrada, entonces MATLAB hace una copia de la matriz original en una nueva ubicación en la memoria, las actualizaciones que copian con el valor modificado y apunta la variable de entrada en la función llamada a esta nueva matriz.
¿Es verdad que usar global
puede ser mejor? Parece un poco descuidado declarar alegremente todos los datos grandes como global
, en lugar de asegurarse de que ninguno de los códigos modifica su argumento de entrada. ¿Me equivoco? ¿Esto realmente mejora el uso de RAM?
¿Por qué no controlas el uso de RAM para ver qué es mejor? No creo que tu pregunta sea diferente a las demás. Necesita perfilar su código. Parece que puede escribir dos bucles y probar si una variable como entrada global o como función es mejor cuando su código cambia los datos de la entrada (si es que lo hace, porque la memoria solo se "duplica" cuando lo hace). Perdón por no dar la respuesta, pero hay demasiados problemas cuando el rendimiento importa. – inerte
Es absolutamente correcto, pero de todos modos hice la pregunta, ya que me preocupaba que esto fuera una cuestión de estilo de codificación y no solo de memoria. Oh, bueno ... – scraimer
Junte cosas que podrían ayudar: "profile on -memory" rastreará la asignación en el perfilador de Matlab. Y si está utilizando R2008a +, los objetos de "manejar" nuevos estilos pueden pasar por referencia, lo que conservará la memoria pero tendrá un mejor control del alcance que los globales. –