--
Вы получили это сообщение, поскольку подписаны на группу "Русский Haskell".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес haskell...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/haskell-russian/e9245621-5c79-4e3e-a07d-c7f3cf89f5ff%40googlegroups.com.
Чтобы настроить другие параметры, перейдите по ссылке https://groups.google.com/d/optout.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/haskell-russian/CAOMWv%3DLtv%2BzyteuXwX6pYXUwuGPSfRJzgNR%3DZNjb6veVWj9GTw%40mail.gmail.com.
Не специалист, но возникает подозрение, что " map BSL.toStrict" провоцирует считывание всего в память.
Может, стОит на кондуитах переписать для контроля памяти и вообще?
суббота, 14 июня 2014 г. в 19:26, Maxim Taldykin написал:
Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CABxyK-nj-eSdikHi2ODMwcmDZeC7djO43OcJMNsNkbki1G25sg%40mail.gmail.com.Настройки подписки и доставки писем: https://groups.google.com/d/optout.
> ret_tupl ts = case readMaybe . BS.unpack $ ts of
Это не причина потребления лишней памяти, но очень неэффективный код.
Для чтения числа из строки лучше использовать decimal из
Data.Text.Read.
Я позволил себе переписать всё на Text.Lazy.Используемая память
пропорциональна размеру хэша с агрегированными данными.
Вполне возможно, что вашем исходном коде память тоже никуда не течёт.
Если в логах преимущественно уникальные адреса, то все их придётся
хранить в хэше и он как раз будет сравним с размерами самого лога.
А расшарьте пожалуйста исходнички на каком-нибудь гитхабе/битбакете,
было бы интересно таки допилить до нормальной производительности.
Магия питона, если не ошибаюсь, заключается в том, что все операции со
строками на сях написаны. В своё время я им парсил логи по 20Gb,
действительно волшебно получалось.
В случае с байтстрингами можно попробовать адресам делать copy[1]
прежде чем вставлять их в хэш, предположительно это уменьшит
используемую память.
Кстати, раз уж у вас несколько файлов с логами, интересно было бы
распараллелить обработку.
> Это всё действительно очевидно, только почему-то никто не написал об
> этом неделю назад.
Все были заняты, или не занимались ручным парсингом строк, в результате
которого в программе остаются объекты ссылающиеся на исходную строку.
Я, например, честно забыл о `copy`, но каждый раз когда вижу подобную
ситуацию в своем коде, то вспоминаю.
Это, действительно, нужно помнить, но с другой стороны во всех серьёзных
мануалах об этом пишут.
>>
>> Кстати хотелось бы ещё раз вставить слово, что в данном случае стоило
>> работать с Text, а не ByteString
>> по следующим причинам:
> Я тоже так думал, но почему-то моя версия с текстом на порядок
> медленнее получилась.
К сожалению я так и не нашёл времени подробно посмотреть код.
Поэтому спрошу так (-O) было? иначе правила не будут использоваться
и основные плюсы Text спадут на нет.
>> Однако стоит заметить, что и с Text Вам понадобиться copy.
>
> Зачем? У них же чанки в хаскельной куче.
Проблема не в положении данных, а в том, что Text имеет тот же формат, что
и ByteString, и тем самым не позволяет освободить чанк, если на него есть
ссылки. А подстроки это ссылки. Тип памяти влияет, но в данном случае
это не должно быть заметно.
Кстати, стоит заметить, что использование ленивых вариантов Text или ByteString
могло сильно улушить memory footprint программы, поскольку они позволяют
освободить чанк, на который никто не ссылается.
Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb7e0_CpaMHLG19ws67dEqbYvBUobNcLBC_YBTS2d_WfVA%40mail.gmail.com.