Управление памятью подядра в Mathematica - PullRequest
5 голосов
/ 21 июля 2011

У меня есть несколько похожий вопрос: Mathematica не хватает памяти

Меня интересует что-то вроде этого:

ParallelTable[F[i], {i, 0, 14.9, 0.001}]

где F[i]сложный числовой интеграл (я еще не нашел простой способ воспроизвести проблему без определения заполнения страницы для интеграла).

Моя проблема заключается в том, что подъядеры взрываются в памяти, и я должен остановить оценку, еслиЯ не позволю машине поменяться местами.

Но даже если я остановлю оценку, ядра не освободят занятую память.

ClearSystemCache[] 

Я даже попробовал

ParallelEvaluate[ClearSystemCache[]]

но

ParallelEvaluate[MemoryInUse[]]

остается на

{823185944, 833146832, 812429208, 840150336, 850057024, 834441704, 
847068768, 850424224}

кажется, что все управление памятью работает только для основного ядра?К настоящему времени единственный способ - закрыть все ядра и запустить их снова.

Я действительно надеюсь, что есть какие-то решения ... Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 24 июля 2011

Управление памятью работает для ядра, где управляющие выражения включают такие функции, как MemoryConstrained, MemoryInUse, Clear, Unset, Remove, $HistoryLength, ClearSystemCache и т. Д. оцениваются Похоже, что в вашем случае источник утечек памяти не связан с внутренним механизмом кэширования Mathematica (спасибо за ссылку, кстати!).

Вы пытались оценить $HistoryLength=0; во всех подядрах, прежде чем использовать их для вычислений? Если вы еще этого не сделали, я настоятельно рекомендую попробовать.

Поскольку вы работаете с функциями численного интегрирования, я предлагаю также попытаться оптимизировать их использование. Например, если вы производите числовую интеграцию с использованием NDSolve и вам нужен только ограниченный набор рассчитанных точек (или даже только одна точка), вам следует использовать форму NDSolve[eqns,y,{x,x_needed_min,x_needed_max}] (или даже NDSolve[eqns,y,{x,x_max,x_max}]) вместо NDSolve[eqns,y,{x,x_min,x_max}] или NDSolve[eqns,y,{x,0,x_max}]. Это может значительно сократить использование памяти в некоторых случаях! Вы также можете использовать EventLocator для управления памятью .

0 голосов
/ 19 августа 2011

У меня была (есть?) Точно такая же проблема, почти слово в слово. Мне просто повезло с добавлением опции к интегралу задачи:

Method-> {"GlobalAdaptive", "SymbolicProcessing"->False}

Вероятно, вы можете выбрать любой другой метод, если хотите, но я успешно справился с этим за последние несколько минут. Кроме того, многие неприятные несоответствия, которые я имел обыкновение получать, исчезли, и интеграция происходит НАМНОГО быстрее.

...