2010-11-06 13 views
5

He escrito un paquete para Mathematica llamado MathOO. En resumen, le permite usar la orientación de objetos en Mathematica tal como lo hace en Python. Por favor, lea el siguiente artículo en Voofie/MathOO para más detalles:Variables temporales en Mathematica

MathOO: Adding Python style Object Orientation to Mathematica with MathOO (1.0 beta launch) [Alternative to Objectica]

El problema que encontramos es que, me gustaría tener recolector de basura, de manera que el usuario no tiene que borrar explícitamente el objeto después de usarlo. Por ejemplo:

NewClass[Object1] 
Object1.$init$[self_]:= Return[]; 

En las dos líneas anteriores, I acaba de definir Object1 a ser una clase nueva, y el constructor para ser una función vacía. Si está familiarizado con Python, debería ver la similitud con __init__().

instanciar un Object1, que hago:

object1 = new[Object1][] 

La salida es:

Out: object$13 

Aquí, el objeto $ 13 es una variable temporal. Lo que quiero es que, cuando no haya referencias a esta variable temporal, se elimine automáticamente. Pero no funciona como se esperaba. He identificado el problema a ser la siguiente:

In: y = Module[{x}, x[1] = 2; x] 
Out: x$117 

In: FullDefinition[y] 
Out: y = x$117 
    Attributes[x$117] = {Temporary} 
    x$117[1] = 2 

Puesto que y contiene una referencia de x $ 117, por lo que x $ 117 no se retira aún. Ahora vamos a suprimir la referencia al establecer el valor de y hasta 1:

In: y = 1; 

Sin embargo, X $ 117 es todavía aquí:

In: Definition[x$117] 
Out: Attributes[x$117] = {Temporary} 
    x$117[1] = 2 

pero esperaba la variable a ser eliminado puesto que ya no se hace referencia a . Desde el manual de Mathematica, que dijo:

símbolos temporales se eliminan si ya no están referenciados:

lo tanto, es un error de Mathematica? ¿O hay algún método de solución? Estoy usando Mathematica 7.0. Muchas gracias.

+0

Ver [esta respuesta] (http: // stackoverflow.com/questions/6867892/reducing-memory-usage-in-an-extended-mathematica-session/6873142#6873142) para algunos errores en el recolector de basura relacionados con 'Module'. –

Respuesta

2

Mathematica realmente la basura recoge Temporary variables cuando no tienen más referencias. Dicho eso, hay dos razones por las que tu x $ 117 no es basura.

  1. Recuerde que utiliza Module ámbito léxico, por lo que las variables de módulo son solamente "local" en el sentido de que son dar un nombre único "var $ modnum" y el TemporaryAttribute. Dado que le dio x a DownValue, se debe borrar antes de que x se recolecte basura.

  2. Su y se estableció a ser la variable temporal x$... y la salida fue asignado a Out[]. Por lo tanto, también debe borrar el historial: Unprotect[In, Out]; Clear[In, Out]; Protect[In, Out];.

A continuación, su Module ejemplo parece ser correctamente recogida de basura.


Al utilizar el paquete de MathOO (que he descargado ayer, pero no he jugado con aún) tal vez sólo puede establecer el $HistoryLength a un número finito. y recomiendan que los usuarios suprimir la salida de ejemplificaciones object1 = new[Object1][];

+0

Sí. Para el segundo punto, normalmente suprimiría la salida. Omití el; solo para que el programa muestre el nombre de la variable para que pueda ver su definición más tarde. Ahora, el principal problema es que no sé cuándo el usuario no hará referencias y DownValue es obligatorio. ¿Es ese DownValue otra referencia que está fuera del alcance de x? Simplemente no quería borrar el valor de Down, y espero que todavía pueda ser basura. – Ross

+0

Me gustaría usar la variable como diccionario. Como dict en Python. Cuando no se hace referencia a la variable, DownValue no tiene ningún significado, por lo que debe ser recogida de basura. No entiendo por qué Mathematica no lo recoge y piensa que todavía quiero usarlo después. – Ross

+1

Tenga en cuenta que suprimir la salida con ';' no impide la asignación del valor de retorno real a 'Out [n]'. –

1

Mathematica es un sistema de cadena de volver a escribir (en la parte inferior) (tipo de) (no realmente) (pero en realidad) (de todos modos ...) El DownValue "x $ 117 [1] = 2 "es una regla de reescritura de cadenas que no es del todo impreciso imaginar es una entrada en una matriz asociativa. La matriz se llama "x $ 117" y la entrada es el par {1,2}. Siempre que haya una entrada en la matriz, se hace referencia al símbolo "x $ 117" y Mma no la aplicará como GC.

Su mejor opción es eliminar los símbolos [] cuando se destruyen o quedan fuera de alcance. (Borrar [] es insuficiente debido a que Borrar los atributos, mensajes o valores predeterminados asociados con símbolos no son eliminados por Borrar [] y así Mma todavía tendrá referencias activas al símbolo.)

Cuestiones relacionadas