Как уменьшить использование памяти в приложении Haskell?

111028 16:57:43 [ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!

Установили ли вы пароль root для своей установки mysql? Это отличается от вашего пароля root sudo. Попробуйте /usr/local/mysql/bin/mysql_secure_installation

32
задан Curt J. Sampson 5 June 2009 в 21:45
поделиться

7 ответов

  1. Списки не являются лучшим datastructure для этого типа кода (с большим количеством из (++), и (в последний раз)). Вы теряете много времени constucting и вскрывающих противоречия списков. Я использовал бы Данные. Последовательность или массивы, как в версиях C.

  2. нет никакого шанса для преобразователей makeu0, который будет собран "мусор", так как необходимо сохранить всех их (хорошо, все результаты "рассеянных", чтобы быть точными) полностью до конца вычисления, чтобы смочь сделать "реверс" в applyBC. Который является очень дорогой вещью, полагая, что Вам только нужны два объекта от хвоста списка для Вашего "zeroflux".

Вот является быстрый взлом Вас кодом, который пытается достигнуть лучшего сплава списка и действительно меньше перечисляет (de) построение:

module Euler1D
( stepEuler
) where

-- impose zero flux condition
zeroflux mu (boundary:inner:xs) = boundary+mu*2*(inner-boundary)

-- one step of integration
stepEuler mu n = (applyBC . (diffused mu)) $ makeu0 n
    where
          diffused mu (left:x:[]) = []    -- ignore outer points
          diffused mu (left:x:right:xs) = -- integrate inner points
                   let y = (x+mu*(left+right-2*x))
                       in y `seq` y : diffused mu (x:right:xs)
          applyBC inner = lbc + sum inner + rbc -- boundary conditions
               where
                     lbc = zeroflux mu ((f 0 n):inner)             -- left boundary
                     rbc = zeroflux mu ((f n n):(take 2 $ reverse inner)) -- right boundary

-- initial condition
makeu0 n = [ f x n | x <- [0..n]]

f x n = ((^2) . sin . (pi*) . xi) x
    where xi x = fromIntegral x / fromIntegral n

Для 200 000 точек, это завершается за 0,8 секунды по сравнению с 3,8 секундами для начальной версии

20
ответ дан 27 November 2019 в 21:06
поделиться

В более общем плане можно узнать, куда память идет с помощью "куча" GHC профильные инструменты. , По моему опыту, они не обязательно скажут Вам, почему Ваши данные пропускаются, но могут, по крайней мере, сузить потенциальные причины.

можно также найти освещение этого превосходное сообщение в блоге Don Stewart о понимании строгости, как это взаимодействует со сборкой "мусора", и как диагностировать и решить проблемы.

4
ответ дан 27 November 2019 в 21:06
поделиться

Делает принуждение "нелень" с помощью $!помощь? согласно этот ответ .

2
ответ дан 27 November 2019 в 21:06
поделиться

На запрос Harleqin: Вы попытались установить флаги оптимизации? Например, с ghc, можно использовать, добавляют "-O2" точно так же, как Вы были бы с gcc. (Хотя я не уверен, какие уровни оптимизации существуют в ghc; в странице справочника точно не говорится...)

В моем прошлом опыте, устанавливание этого флага сделало огромный различие. Насколько я могу сказать, runhugs и неоптимизированный ghc используют самую основную, очевидную реализацию Haskell; к сожалению, это иногда не очень эффективно.

, Но это - просто предположение. Как я сказал в своем комментарии, я надеюсь, что кто-то отвечает на Ваш вопрос хорошо. У меня часто есть проблемы при анализе и фиксации использования памяти Haskell.

1
ответ дан 27 November 2019 в 21:06
поделиться

Используйте переключатель -fvia-C также.

1
ответ дан 27 November 2019 в 21:06
поделиться

Одна вещь, которая перешла к моему глазу теперь, состоит в том, что вывод Haskell является плаванием, в то время как вывод C, кажется, целое число. Я еще не боролся с кодом Haskell, но есть ли, возможно, некоторое место, где у Вас есть арифметика с плавающей точкой в Haskell, в то время как C использует целые числа?

0
ответ дан 27 November 2019 в 21:06
поделиться

В моей 32-разрядной системе x86 ваша программа использует только около 40 МБ памяти.

Возможно, вы путаете строку «total alloc = 116 835 180 байт» из выходных данных профилирования с сколько памяти фактически используется программой в любой момент времени? Общий объем памяти - это объем памяти, выделенный для всего выполнения программы; большая часть этого освобождается сборщиком мусора по мере вашего продвижения. Вы можете ожидать, что это число станет очень большим в программе на Haskell; У меня есть программы, которые выделяют много террабайт памяти в течение всего своего выполнения, хотя на самом деле у них максимальный размер виртуальной памяти составляет около ста мегабайт.

Я бы не стал слишком беспокоиться о больших общих выделениях в течение курса запуска программы; это природа чистого языка, и GHC '

10
ответ дан 27 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: