profiling memory-management wolfram-mathematica

profiling - Uso de memoria de perfil en Mathematica



memory-management wolfram-mathematica (4)

¿Hay alguna forma de perfilar el uso de la memoria mathkernel (hasta variables individuales) que no sea pagar $$$ por su complemento Eclipse (Mathematica Workbench, iirc)?

En este momento, termino la ejecución de un programa que toma varios GB de RAM, pero las únicas cosas que se almacenan deben ser ~ 50MB de datos como máximo, pero mathkernel.exe tiende a mantener ~ 1.5GB (básicamente, tanto como Windows darle). ¿Hay alguna forma mejor de evitar esto, aparte de guardar los datos que necesito y salir del kernel cada vez?

EDITAR: Acabo de enterarme de la función ByteCount (que muestra algunos resultados perturbadores en tipos de datos básicos, pero ese no es el punto), pero incluso la suma de todas mis variables no se acerca a la cantidad tomada por mathkernel. ¿Lo que da?


Aquí está mi solución para perfilar el uso de la memoria:

myByteCount[symbolName_String] := Replace[ToHeldExpression[symbolName], Hold[x__] :> If[MemberQ[Attributes[x], Protected | ReadProtected], Sequence @@ {}, {ByteCount[ Through[{OwnValues, DownValues, UpValues, SubValues, DefaultValues, FormatValues, NValues}[Unevaluated@x, Sort -> False]]], symbolName}]]; With[{listing = myByteCount /@ Names[]}, Labeled[Grid[Reverse@Take[Sort[listing], -100], Frame -> True, Alignment -> Left], Column[{Style[ "ByteCount for symbols without attributes Protected and / ReadProtected in all contexts", 16, FontFamily -> "Times"], Style[Row@{"Total: ", Total[listing[[All, 1]]], " bytes for ", Length[listing], " symbols"}, Bold]}, Center, 1.5], Top]]

Evaluación de lo anterior da la siguiente tabla:


La answer Michael Pilat es buena, y MaxMemoryUsed y MaxMemoryUsed son probablemente las mejores herramientas que tiene. ByteCount rara vez es tan útil porque lo que mide puede ser una gran sobreestimación porque ignora las subexpresiones compartidas y, a menudo, ignora la memoria que no es accesible directamente a través de las funciones de Mathematica, que a menudo es un componente importante del uso de la memoria.

Una cosa que puede hacer en algunas circunstancias es usar la función Share , que obliga a compartir las subexpresiones cuando sea posible. En algunas circunstancias, esto puede ahorrarle decenas o incluso cientos de magabytes. Puede saber qué tan bien está funcionando usando MemoryInUse antes y después de usar Share .

Además, algunas cosas de apariencia inocua pueden hacer que Mathematica use mucha más memoria de la que usted espera. Las matrices contiguas de reales de máquina (y solo reales de máquina) pueden asignarse como las denominadas matrices "empaquetadas", en gran medida de la forma en que serían asignadas por C o Fortran. Sin embargo, si tiene una combinación de reales de máquina y otras estructuras (incluidos los símbolos) en una matriz, todo tiene que ser "boxed" , y la matriz se convierte en una matriz de punteros, que pueden agregar una gran cantidad de sobrecarga.


Una forma es automatizar el reinicio del kernel cuando se queda sin memoria. Puede ejecutar el código que consume memoria en un núcleo esclavo, mientras que el núcleo maestro solo toma el resultado del cálculo y controla el uso de la memoria.


Una cosa que muchos usuarios no se dan cuenta es que se necesita memoria para almacenar todas sus entradas y salidas en los símbolos de entrada y Out , independientemente de si asigna o no una salida a una variable. Out también tiene un alias como % , donde % es el resultado anterior, %% es el segundo al último, etc. %123 es equivalente a Out[123] .

Si no tiene el hábito de usar % , o solo lo usa a unos pocos niveles de profundidad, establezca $HistoryLength en 0 o en un pequeño entero positivo, para mantener solo las últimas (o ninguna) salidas alrededor de Out .

Es posible que también desee ver las funciones MaxMemoryUsed y MaxMemoryUsed .

Por supuesto, el problema de $HistoryLength puede ser o no tu problema, pero no has compartido cuál es tu evaluación real. Si puedes publicarlo, quizás alguien pueda arrojar más luz sobre por qué es tan intensivo en memoria.