Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выгрузить модуль Perl? 
V
    Опции темы
tishaishii
Дата 13.7.2012, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Нашёл шутку:
Код
#!/usr/bin/perl

my $use = 1 ;

if ( $use ) {
 use DBI ;
} else {
 DBI -> import ( ) ;
}

print ( join ( "\n" , DBI -> available_drivers ( ) ) ) ;


Работает одинаково при $use = 1 и undef ( ) ;

`no DBI` память не освобождает.
Как избавиться от DBI?

Это сообщение отредактировал(а) tishaishii - 13.7.2012, 15:22
PM MAIL ICQ Skype   Вверх
DurRandir
Дата 13.7.2012, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>Работает одинаково
Потому что use - команда времени компиляции, а if - времени исполнения. И ваш код, на самом деле, выглядит как

Код

if ($use){
 BEGIN{require DBI; DBI->import}
}


Почитайте perldoc -f use, perldoc perlmod.

>память не освобождает
И не должно. Что вы вообще хотите сделать?

Это сообщение отредактировал(а) DurRandir - 13.7.2012, 17:51
PM   Вверх
tishaishii
Дата 15.7.2012, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Освободить память. Например, за счёт выгрузки модуля, который больше не нужен.
Предполагается много процессов одного и того же.
PM MAIL ICQ Skype   Вверх
shamber
Дата 15.7.2012, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: 17
Всего: 18



perl помнится, освобождать память не особо любит
PM MAIL Jabber   Вверх
DurRandir
Дата 16.7.2012, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



1. Отличный кандидат на XY-вопрос месяца) 
2. http://stackoverflow.com/questions/9145990...rom-child-stack - там не всё верно, но основную мысль доносит)
3. На десерт) Если перл собран с usemymalloc, то в систему он память не вернёт никогда (но с лёгкостью переиспользует для своих нужд)

PM   Вверх
Pfailed
Дата 16.7.2012, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Class::Unload. Освободит ли это память хотя бы для переиспользования непонятно, нужно проверять.


--------------------
PM MAIL   Вверх
tishaishii
Дата 16.7.2012, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Цитата
...на самом деле выглядит так:...

Так вот. Без всяких if'ов выглядит, думаю: 
Код
require DBI; DBI->import


Спасибо, может быть,  всё-таки будет полезен модуль Class:Unload.
Выполнил скрипт:
Код
perl -MClass::Unload -e 'until( undef ( ) ) { use DBI ; sleep ( $ARGV [ 0 ] ) ; Class::Unload -> unload ( q(DBI) ) ; sleep ( $ARGV [ 0 ] ) ; }' 3  &
 смотрел htop, никаких изменений не видел. Возможно, память для повторного использования освобождается. Сегодня в течении дня протестирую получше.

Итого. Вижу подходы к решению:
  •  разделять на потоки, вместо форков ;
  •  разделять на сервера по задачам.
Комментарий к 1му варианту. У меня сейчас в обработке предполагаются ошибки с выходом. Придётся перестраивать взаимодействие и много-много тестировать. И всё равно, в итоге, дополнительно делить на процессы. Потенциально, потребление ресурсов можно свести к какому-то желаемому минимуму.
Комментарий ко 2му варианту. Тщательно проектировать, либо может ресурсов съесть больше, или раскидывать по разным машинам. Всё равно, тщательно проектировать.
Вывод: оба варианта требуют достаточно много времени для доработки.

А вот если в главном процессе использовался какой-то модуль, а в дочернем этот модуль может быть нужен, а может быть нет (зависит от запроса), то что делать?

Это сообщение отредактировал(а) tishaishii - 16.7.2012, 07:26
PM MAIL ICQ Skype   Вверх
vadiml
Дата 16.7.2012, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



У меня когда была проблема с использованием тяжёлого, но редкоиспользуемого модуля, я её решил через system, т.е. написал отдельный скрипт на perl-e и вызывал его как внешнюю программу.

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

Именно из-за политики складывания про запас надо так же быть внимательным с хранением больших данных в переменных.
PM MAIL Jabber   Вверх
tishaishii
Дата 16.7.2012, 07:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



То есть, вы предлагаете использование отдельного процесса для вычислений. Вот я подумал, в общем случае, сервер для этого может подойти. Хотя... если мелочь, конечно, с system проще. Вот как быть с DBI?
Или Config::General? Парсит конфиг, допустим, выдаёт его в каком-то формате в STDOUT и пишет в STDERR ошибки. Основной процесс читает STDOUT, который снова нужно парсить?

Это сообщение отредактировал(а) tishaishii - 16.7.2012, 07:30
PM MAIL ICQ Skype   Вверх
vadiml
Дата 16.7.2012, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



Тяжёлый модуль стоит отдельно выделять только если Вы его используете его весьма редко,
иначе будет много накладных расходов и Вы только потеряете в скорости работы.

Весь вывод внешнего скрипта через STDOUT автоматически попадёт в Вашу переменную:

my $answ = `perl скрипт.pl -a -b`; # тут обратные кавычки
PM MAIL Jabber   Вверх
DurRandir
Дата 16.7.2012, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



>разделять на потоки, вместо форков
Запасся попкорном

Это сообщение отредактировал(а) DurRandir - 16.7.2012, 14:11
PM   Вверх
tishaishii
Дата 16.7.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 4
Всего: 8



Сообщи что-нибудь, что поможет.
[hr]

Протестировал Class::Unload. До сих пор точно сказать не смогу, но, кажется, всё-таки, освобождает память для повторного использования. Спасибо.
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1288 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.