Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Сохранение XS объектов в memcache


Автор: KSURi 21.7.2009, 20:32
Привет.

Захотелось мне сохранять в memcache распарасенный XML. Для работы с XML в проекте везде используется XML::LibXML, использовать другие модули не хочется. Проблема в том, что сохранять в кэш XS-объекты нельзя(
Может кто-то сталкивался? Есть какие-то хаки?

Автор: gcc 21.7.2009, 21:02
может cерилизировать JSon или Storable и сохранить?

Добавлено через 6 минут и 41 секунду
Код

 use MIME::Base64;
 use Storable qw/nfreeze thaw/;
 my $decoded = thaw(decode_base64($loop_data->{session_data}));
use Data::Dumper;
  print Dumper($decoded);




Код

$VAR1 = {
          '__user_realm' => 'default',
          '__created' => '1233338621',
          '__user' => '1',
          '__updated' => '1233338622'
        };

Автор: arto 22.7.2009, 20:10
если объект может самосериализоваться (сохранять внутреннее состояние), то проблем нет.
если не может, то можете дописать требуемую функциональность и послать патч мантайнеру.

Автор: KSURi 22.7.2009, 20:52
Цитата(arto @  22.7.2009,  20:10 Найти цитируемый пост)
если объект может самосериализоваться (сохранять внутреннее состояние), то проблем нет.

Их бы не было, если бы объект создавался PurePerl кодом. Когда вы пытаетесь сохранить объект созднный XS кодом, то сохраняется по сути только указатель на сишную структуру.

Автор: arto 23.7.2009, 09:09
ключевое слово "самосериализоваться"

Автор: sir_nuf_nuf 23.7.2009, 10:05
KSURi, конечно нельзя. XS объект - это C структура(ы) которые привязаны к адресам в памяти, для того что бы записать их MC - нужно избавиться от адресной привязки, т.е. сереализовать.

В вашем случае XML - это и есть сереализованное представление. Так что храните сам XML а не DOM модель.

Парсится медленно - юзайте libxml2. Все равно медленно? не юзайте XML. 

Автор: KSURi 23.7.2009, 10:51
Цитата(sir_nuf_nuf @  23.7.2009,  10:05 Найти цитируемый пост)
KSURi, конечно нельзя. XS объект - это C структура(ы) которые привязаны к адресам в памяти, для того что бы записать их MC - нужно избавиться от адресной привязки, т.е. сереализовать.

Я в курсе)
Цитата(sir_nuf_nuf @  23.7.2009,  10:05 Найти цитируемый пост)
Парсится медленно - юзайте libxml2. Все равно медленно? не юзайте XML.  

В первом посте я написал, что юзаю XML::LibXML, который является оберткой к libxml2.
"не юзать XML" не получится.

В принципе, я уже понял, что придется думать в другую сторону. Вопрос можно считать снятым.

Автор: sir_nuf_nuf 23.7.2009, 11:00
KSURi, можно конечно "расчехлить свой компилер" и написать примочку для libxml2 на C, что бы DOM структуру упаковывала в линейный кусок памяти, а потом обратно. Это будет круто, ибо на такую задачу натыкались кроме вас люди (как минимум я =)). 

В конце я решил, что 8 тыс. разборов / сереализаций в секунду (для XML на экран размером) - это достаточно быстро, что бы не парится.

Автор: shamber 24.7.2009, 11:30
http://search.cpan.org/~ken/XML-XML2JSON-0.05/lib/XML/XML2JSON.pm не то?

Автор: sir_nuf_nuf 24.7.2009, 15:47
shamber, XML и JSON далеко не эквиваленты. к тому же эта та же самая сереализация. Не думаю, что это намного быстерее чем внутренний механизм libxml2. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)