Хранить массив Perl в памяти для других экземпляров Perl

Я использую perl-скрипт, который при получении параметров проверяет одно значение в базе данных, а затем соответственно выполняет другие действия. Поскольку трафик увеличивается, выполняется много операций чтения/записи mysql, что может повлиять на производительность.

Поскольку данные, хранящиеся в mysql, на самом деле не сложны, мне интересно, лучше ли хранить массив в памяти, который затем может быть прочитан/изменен другими экземплярами Perl по мере их запуска.

Это возможно?


person Diego    schedule 02.07.2015    source источник
comment
perldoc.perl.org/perlipc.html или, возможно, Redis (через сокет unix).   -  person mpapec    schedule 02.07.2015
comment
Помните, что база данных также имеет собственное кэширование для оптимизации дискового ввода-вывода. Если вы часто читаете одни и те же строки, база данных может уже хранить их в оперативной памяти. Вам нужно будет профилировать mysql, чтобы проверить. Он также поддерживает временные таблицы.   -  person Kim Ryan    schedule 02.07.2015
comment
Чтение/запись mysql... может повлиять на производительность Не следует делать догадки о том, где могут быть узкие места. Вы должны использовать один из превосходных профилировщиков Perl от CPAN, чтобы найти реальную проблему, и работать над этой областью, чтобы ускорить процесс. То есть если предположить, что ваше приложение действительно работает слишком медленно?   -  person Borodin    schedule 02.07.2015
comment
Хранилище ключей/значений, такое как Redis, звучит как хорошая идея. Вы также можете сделать так, чтобы Perl-приложение не было сценарием с одиночными вызовами, а работало как демон. Тогда у вас может быть таблица поиска в памяти. Если это веб-приложение, рассмотрите Plack и его друзей, таких как Dancer2. Если нет, есть способы демонизировать вещи.   -  person simbabque    schedule 02.07.2015


Ответы (1)


Вы можете использовать общую память

IPC::SharedMem — базовый модуль низкого уровня.

Чтобы не изобретать велосипед, взгляните на:

IPC::Shareable

IPC::Shareable позволяет связать переменную с общей памятью, что упрощает обмен содержимым этой переменной с другими процессами Perl. Скаляры, массивы и хэши могут быть связаны. Привязываемая переменная может содержать сколь угодно сложные структуры данных — в том числе ссылки на массивы, хэши хэшей и т.д.

person frhack    schedule 02.07.2015
comment
Спасибо, это интересный выбор. Я смотрел на это, и кажется, что эта библиотека полагается на работающее приложение сервера, чтобы сохранить переменную в памяти? в моем случае у меня есть perl-скрипт, который запускается каждый раз, когда приходит новое событие, это всегда один и тот же скрипт, поэтому нужно ли мне создавать демон для хранения общих переменных? - person Diego; 04.07.2015
comment
Нет, ему не нужен какой-либо серверный процесс. В примерах автор использовал имена server/clients только для того, чтобы показать, что это работает как взаимодействие клиент/сервер, но гораздо проще. - person frhack; 04.07.2015