![]() |
|
![]() ![]() ![]() |
|
Lazin |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
написал небольшую програмку на Haskell-e для проверки целостности лог файлов, в общем задание такое, есть файл вида
в котором записи идут болшую часть времени по порядку но могут быть перемешаны, программа должна проверять, есть ли среди них пропщеные или повторяющиеся ( номера записей идут после m: ), причем запись может быть перемещены на несколько тысяч строк вперед или назад, ну и файлы оч. большие, все в память грузить не вариант вот что у меня получилось:
проблема в том, что это работает слишком медленно, аналогичный код написаный на питоне работает намного быстрее ![]() что я делаю не так, просто это моя первая программа на Haskell, много чего я еще не понимаю ![]() |
||||
|
|||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
с помощью Data.Set избавился от сортировки списка, работает шустро, но, кушает много памяти, к примеру, если на вход подать файл размером 40Мб, в котором будет отсутствовать строка в самом начале, то оно выжрет примерно 300Мб оперативки, что немного смущает, как-то оно не очень эффективно работает с памятью...
Добавлено через 13 минут и 57 секунд так-же смущат то, что компилятор(GHC) не может сам распознать возможность бесконечной рекурсии, либо не полный pattern matching, хотя в остальном все классно =) еще подумалось, что такой код можно очень легко и практически полностью покрыть тестами |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
люди, вы где?
|
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Lazin, не торопись
![]() ![]() Насколько я понимаю, без возможности бесконечной рекурсии чистый ФЯ будет не Тьюринг-полным. С трудом представляю себе статический анализ, способный определить возможность зацикливания. Эффективность по памяти — не самая сильная сторона Haskell. Возможно, ты решаешь задачу слишком энергично. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
узкое место я уже нашел - дело было в алгоритме, избавился от постоянной сортировки постоянно увеличивающегося в размере списка и все заработало быстро вот это уже удручает, я правильно понимаю, что это из-за того, что приходится создавать каждый раз новых объект вместо того что-бы изменить старый? |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Это как раз не так страшно, ведь зачастую новый объект разделяет со старым большую часть своей структуры. Кроме этого, thunk может быть больше, чем значение, которое он вычислит. Особенности представления строк: с [Char] удобно работать, но представь, сколько оно занимает. Впрочем, думаю, оптимизировать эту задачу по памяти можно. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
а с обычными массивами там можно работать, или только с ByteString?
Добавлено через 1 минуту и 21 секунду видимо Haskell для работы не очень подходит, слишком мало контроля над тем как программа всебя ведет.. |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
Вообще, мне подумалось, что было-бы неплохо начать использовать в работе какой-нибудь ФП язык, со строгой статической типизацией, из 3х вариантов - Clean, Haskell, OCaml я выбрал второй, видимо надо будет попробовать третий =)
|
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
http://haskell.org/haskellwiki/Arrays А с этой задачей попробуй на RSDN.decl, там как раз недавно обширные обсуждения по поводу Haskell in the real world были. Опытные собаководы покажут, как красиво сделать ![]() -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
А насколько OCaml ближе к реальному миру, чим Haskell?
![]() |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
OCaml даже после короткого знакомства с Haskell имеет все шансы показаться корявым, хотя бы из-за отсутствия type classes. Стандартная библиотека опять же скудновата по сравнению с GHC, на ExtLib или batteries придётся смотреть довольно скоро. Но контролировать поведение программы легче, да. По крайней мере для человека, не освоившегося с чистым ленивым языком. Посмотреть, в общем, стоит: из строгих ФЯ со статической типизацией OCaml по любому безальтернативен. (забыл про F#, Nemerle). Я бы не сказал, что Haskell дальше или OCaml ближе. Просто у Haskell порог вхождения, пожалуй, выше. Haskell синтаксически и концептуально красивее, OCaml может быть шустрее, а про библиотеки я уже сказал. Это сообщение отредактировал(а) Void - 25.1.2009, 12:22 -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: нет Всего: 154 |
Под строгостью я имел ввиду строгую типизацию, то-есть что-бы int нельзя было привести к float неявно, а не строгость как альтернативу ленивости. Но пока я не могу контролировать поведение программы на Haskell и это обламывает. Мне даже сложно отладочную печать вставить в код =) |
|||
|
||||
Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 1 Всего: 173 |
Я понял, просто выделил именно разницу строгий—ленивый. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]() ![]() ![]() |
Правила форума «Функциональные языки: общие вопросы» | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Функциональные языки: общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |