metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2009-12-14 02:44 pm

Пределы роста

Исходник на хаскеле, 2.8 мега, 6000 строк, экспорт из базы данных. GHC при компиляции падает с переполнением стека.

PS: Собралось:

D:\Programm\Haskell\ghc-6.10.2\bin\ghc.exe --make -o test2.exe "test2.hs" +RTS -K100000000
В процессе сожрало 1.5 гигабайта памяти :)

Екзешник получился 43 мегабайта. Отрабатывает сортировку списка и вывод проекции из него достаточно быстро.
Теперь мне пришло в голову, что можно сделать экспорт в более гуманный формат (CSV или вообще бинарный), а из метаданных, которые живут в базе, сгенерить его читалку, тогда компилироваться будет быстро, и можно будет проверить на больших объемах данных.

[identity profile] thedeemon.livejournal.com 2009-12-14 04:55 pm (UTC)(link)
>В процессе сожрало 1.5 гигабайта памяти :)

А вот это уже характерно. Когда лучшая программа на Хаскелле (которую всегда называют при просьбе показать большой проект) ест столько памяти на небольшом и довольно безобидном инпуте. Real World Haskell как он есть.

[identity profile] http://users.livejournal.com/_zerg/ 2009-12-14 05:05 pm (UTC)(link)
У меня плюсы (gcc) сжирают около двух гигов памяти при компиляции.

[identity profile] dmzlj.livejournal.com 2009-12-14 05:09 pm (UTC)(link)
Трехмегабайтного файла?

[identity profile] http://users.livejournal.com/_zerg/ 2009-12-14 05:14 pm (UTC)(link)
не скажу точно на какой файле это происходит, но весь проект на три с половиной мега.

[identity profile] dmzlj.livejournal.com 2009-12-14 05:57 pm (UTC)(link)
ну таки есть разница.

[identity profile] kiryl.livejournal.com 2009-12-14 07:35 pm (UTC)(link)
При агрессивном использовании препроцессора/шаблонов размер исходного файла значения не имеет.

[identity profile] http://users.livejournal.com/_zerg/ 2009-12-15 03:52 am (UTC)(link)
Так оно и есть.

[identity profile] http://users.livejournal.com/_zerg/ 2009-12-15 03:51 am (UTC)(link)
Я хотел сказать, что 1.5G отъеденных GHC не так уж и плохо.

[identity profile] metaclass.livejournal.com 2009-12-14 05:52 pm (UTC)(link)
Какая она лучшая? Это банальный тест, сгенеренный из базы исходник (просто данные) и к нему два файла обвязки коротеньких.

Я вообще проверяю идею "можно ли обрабатывать большие объемы данных хаскелем". Вообще судя по результатам - можно, вот только прикручу еще загрузку данных из внешнего файла, и запилю туда гига два экспорта из базы :)

[identity profile] dmzlj.livejournal.com 2009-12-14 05:53 pm (UTC)(link)
Лучшая известная программа на хаскелле --- это компилятор хаскелла

[identity profile] metaclass.livejournal.com 2009-12-14 05:56 pm (UTC)(link)
А-а, еле дошло :)

[identity profile] holmic.livejournal.com 2009-12-14 11:20 pm (UTC)(link)
и чем же этот инпут небольшой и безобидный? 6000 сущностей в одном модуле, которые нужно оттайпчекать хиндли-милнером - по-моему вполне ожидаемое поведение.
Можно и строчку придумать, которая будет там выдавать какой-нибудь тапл в миллион полей и ghc на такой строчке тоже сломается.

[identity profile] thedeemon.livejournal.com 2009-12-15 12:52 am (UTC)(link)
Да вроде Хиндли-Милнер сам по себе много памяти не требует. Я бы еще понял, если бы там были мегабайты сложного кода с классами и семействами типов и пр. А тут просто табличка. Получается по 10 КБ на одну переменную...

[identity profile] palm-mute.livejournal.com 2009-12-15 12:57 pm (UTC)(link)
Хиндли-Милнера можно свести с ума простым кодом:
let f1 x = (x, x)
let f2 x = f1 (f1 x)
let f3 x = f2 (f2 x)
let f4 x = f3 (f3 x)
let f5 x = f4 (f4 x)
let f6 x = f5 (f5 x)
let f7 x = f6 (f6 x)

[identity profile] metaclass.livejournal.com 2009-12-15 01:35 pm (UTC)(link)
Ууу, какая полезная шиза:)

[identity profile] thedeemon.livejournal.com 2009-12-15 02:11 pm (UTC)(link)
Скормил Окамлу, он надолго задумался, но в константной памяти - 2 мега всего. Что подтверждает мои слова выше.