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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> тест освобождения памяти, хочу убедиться, что память освобождается 
:(
    Опции темы
ginnie
Дата 11.4.2008, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 49



Уважаемый BurnerCode все приведенные модули помогают избавиться от циклических ссылок. В контексте данного топика они бесполезны.

Это сообщение отредактировал(а) ginnie - 11.4.2008, 11:15


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 11.4.2008, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Память не освобождается при выходе из любого блока или только if?

Если блок if поместить в бесконечный цикл? Память закончится?
PM MAIL   Вверх
ginnie
Дата 11.4.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 49



Уважаемый tolkien, похоже, что не освобождается при выходе из любого блока.

При использовании блока внутри цикла  память не освобождается, но повторно используется для тех-же самых переменных, поэтому она не может закончится.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 11.4.2008, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Получается Perl вобще память не освобождает в процессе работы? 


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


Шустрый
*


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

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



Высвобождает, но:
1. Память, выделенную для блоков резервирует под повторное использование.
2. Не удаляет те элементы, на которые сохранились ссылки.

--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
shamber
Дата 11.4.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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




ginnie, потестил  Ваш код под win32. Как и следовало ожидидать результат тот же.
PM MAIL Jabber   Вверх
ginnie
Дата 11.4.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 49



Цитата

1. Память, выделенную для блоков резервирует под повторное использование.


GoDleSS, выделенную не для блоков, а для конкретных переменных (т.е. если в блоке две переменные и под одну выделилось 1 Мб, то в следующем проходе при записи во вторую переменную текста в 1 Мб будет дополнительно выделено 1 Мб)!

Добавлено @ 14:40
Вчера выяснил, что эти проблемы с памятью (кроме блоков if), а также многие другие описал Даниил Алиевский в статье "Эффективное использование памяти в Perl при работе с большими строками", опубликованной в журнале Системный администратор в октябре 2002.

Это сообщение отредактировал(а) ginnie - 11.4.2008, 15:04


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
GoDleSS
Дата 11.4.2008, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

GoDleSS, выделенную не для блоков, а для конкретных переменных (т.е. если в блоке две переменные и под одну выделилось 1 Мб, то в следующем проходе при записи во вторую переменную текста в 1 Мб будет дополнительно выделено 1 Мб)!

Полностью согласен, но не всегда четко выражаю свои мысли ((

Цитата

GoDleSS, выделенную не для блоков, а для конкретных переменных (т.е. если в блоке две переменные и под одну выделилось 1 Мб, то в следующем проходе при записи во вторую переменную текста в 1 Мб будет дополнительно выделено 1 Мб)!

Кстати, давным давно читал, занятная статейка в плане оптимизации )
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
sir_nuf_nuf
Дата 16.4.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати в той забавной статье написано, что 

Цитата

никогда не следует писать
выражение, результат которого - боль-
шая строка. Нельзя писать даже так:
    
my $v = $very_long_text . "\n";



т.к. при этом для вычисления выражения конкатенации будет выделена память, которую потом нельзя освободить.

т.е. я правильно понимаю, что очень_длинная_строка будет отъедать память трижды: 
в $very_long_text, в выражении $very_long_text . "\n" и в $v  ?

разве при присваивание переменной выражения память от выражения не освобождается ? (обычный стек)

P.S. (to KSURi & co.) Есть какой-нть модуль что бы посмотреть дерево операций ( байт-код т.е.) которое перл строит по выражению ?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
KSURi
Дата 16.4.2008, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 20
Всего: 27



Цитата(sir_nuf_nuf @  16.4.2008,  10:29 Найти цитируемый пост)
P.S. (to KSURi & co.) Есть какой-нть модуль что бы посмотреть дерево операций ( байт-код т.е.) которое перл строит по выражению ? 

Код

C:\>type t.pl
#!perl

use strict;
use warnings;

print 'Hello, world!', "\n";

C:\>perl -MO=Bytecode,-ot.pasm t.pl
No package specified for compilation, assuming main::
t.pl syntax OK

C:\>perl -M"B::Disassembler 'disassemble_fh'" -e"open(my $fh, 't.pasm');disassemble_fh($fh,sub{print join qq{\n}, @_})" > t.pdasm

C:\>



--------------------
Died at Life.pl line 21
PM Jabber   Вверх
ginnie
Дата 16.4.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 38
Всего: 49



sir_nuf_nuf, посмотри модуль B::Concise. Я, правда, пока еще сам с ним не разобрался до конца.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
tolkien
Дата 20.4.2008, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(sir_nuf_nuf @ 16.4.2008,  10:29)
...

Цитата

никогда не следует писать
выражение, результат которого - боль-
шая строка. Нельзя писать даже так:
    
my $v = $very_long_text . "\n";



т.к. при этом для вычисления выражения конкатенации будет выделена память, которую потом нельзя освободить.

т.е. я правильно понимаю, что очень_длинная_строка будет отъедать память трижды: 
в $very_long_text, в выражении $very_long_text . "\n" и в $v  ?

разве при присваивание переменной выражения память от выражения не освобождается ? (обычный стек)

...

есть разница по ресурсам писать так? 
        my $v = $very_long_text . "\n";
или так
        my $v = "$very_long_text\n";
PM MAIL   Вверх
GoDleSS
Дата 20.4.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

есть разница по ресурсам писать так? 
        my $v = $very_long_text . "\n";
или так
        my $v = "$very_long_text\n";

Практически нет, в обоих случаях будет использовано:
память от $very_long_text+ память от "\n"(незначительно) + память, занимаемая объедененной строкой.

А вот при print ...
лучше использовать 
print $very_long_text, "\n";
т.к. тут получается 2 раздельных параметра и в случае
print $very_long_text, "\n";
занимаемая память удвоится, а в случае
print "$very_long_text\n";
утроится
Вот такая бяка....
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
gcc
Дата 7.8.2009, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

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



кстате, вот увидел, кто как пишет и как правильно?

Код

  $sth = $dbh->prepare(qq{
      SELECT fullname FROM people WHERE $sql_clause
  });


Код

  $sth = $dbh->prepare(q{
      SELECT fullname FROM people WHERE $sql_clause
  });


Код

  $sth = $dbh->prepare("
      SELECT fullname FROM people WHERE $sql_clause
  ");


Код

 my $sql = 'SELECT fullname FROM people WHERE '.$sql_clause;
  $sth = $dbh->prepare($sql);


PM WWW ICQ Skype GTalk Jabber   Вверх
DaemonSuw
Дата 7.8.2009, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



По моему правильно так 
Код

my $sth = $dbh->prepare('SELECT * FROM people WHERE lastname = ?')
$sth->execute($lastname) 



Код

  $sth = $dbh->prepare(q{
      SELECT fullname FROM people WHERE $sql_clause
  });

Этот вариант без все равно что 'SELECT fullname FROM people WHERE $sql_clause' - без интерполяции

gcc, "тест освобождения памяти, хочу убедиться, что память освобождается" - но почему вопрос в этом топике?
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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