суббота, 17 апреля 2010 г.

Экономия памяти: YAML::Tiny

Небольшое вступление для тех, кто  еще не использует YAML (позволю себе процитировать википедию )
YAML — человекочитаемый формат сериализации данных, концептуально близкий к языкам разметки, но ориентированный на удобство ввода-вывода типичных структур данныхмногих языков программирования. 
Я использую YAML для разного рода конфигурационной информации.
Почему я использую YAML? :
  • YAML краток и понятен;
  • YAML очень выразительный и расширяемый;
  • YAML допускает простой потоковый интерфейс;
  • YAML использует структуры данных, родные для языков программирования;
  • YAML легко реализуется, возможно, слишком легко;
  • YAML использует цельную модель данных. Нет исключений — нет беспорядка.
Сабж
Идея YAML::Tiny - Читать/Писать  YAML данные с минимальными затратами + минимум внешних зависимостей(не использует ничего, кроме стандартных модулей). 
Просто заменив в коде:
use YAML 'LoadFile';
на 
use YAML::Tiny 'LoadFile'; 
я сэкономил 4МБ памяти в каждом FCGI процессе!!!

Спецификация YAML невероятно огромна.  И Pure Perl реализация - модуль  YAML поддерживает ее полностью и съедает 4МБ оперативной памяти. Yaml::Tiny мал и быстр за счет того, что он не поддерживает все возможности описанные в спецификации.  

ЗЫ: Если не хватает возможностей YAML::Tiny, тогда следует смотреть в сторону YAML::Syck


6 коммент.:

alienator комментирует...

Я предпочитаю для подобных целей JSON, модуль соответственно JSON::XS. Быстрый до невероятия. Зависимостей тоже нет.

Но конфигурационные файлы — всё-таки Config::File и ему подобные. Оно привычнее как-то.

koorchik комментирует...

JSON::XS - согласен, что исключительно быстрый модуль ( даже писал когда-то про него http://koorchik.blogspot.com/2010/01/blog-post_26.html ) и использую его вовсю, но не для конфигурационных целей - для формирования JSON данных для браузера.

YAML нравиться тем, что для него реализован парсер практически на любом юзыке программирования.
Базовый конфиг обычно создаю просто дампом перловой структуры, а затем уже вношу изменения руками. И нравиться, что YAML ругается на любую ошибку.

alienator комментирует...

Дык, попробую YAML как-нибудь на досуге. Но, имея уже один устоявшийся синтаксис для конфигов (апачевский .conf) и один — для сериализации структур (JSON), не хочется плодить сущности :)

Alexey комментирует...

YAML действительно прекрасный формат, но YAML::Tiny ужасен.
В основном потому, что в случае, если где-то есть ошибка identation, то YAML::Tiny не скажет, где именно, и поиски могут растянуться надолго..

Николай Мишин комментирует...

Согласен с Alexey, что при битом файле - замучаешься находить ошибку в YAML::Tiny формате, была такая байда, но для простых key:value - работает надежно

koorchik комментирует...

Ну для поиска ошибки можно использовать полноценный модуль "YAML" и делать что-то типа
perl -MYAML -e 'YAML::LoadFile("file.yml")'

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)