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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка памяти, в чем может быть дело? 
V
    Опции темы
DooZ
Дата 15.4.2010, 02:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Здравствуйте,

Код

#!/usr/bin/perl -w

use strict;

my @templates = ();

open(IN, 'file.txt');

    while (my $line = <IN>)
    {
    chomp($line);
    next if (!$line);
    push(@templates, $line);
    }

close(IN);

@templates = ();
undef @templates;

sleep();


файл 87 метров, в памяти загружается и сжирает по top 3.9% (памяти 4 гига), после очистки внизу, остается висеть 3.7%
если в массив @templates не записывать ничего то висит процесс с 0.3% памяти
вопрос, почему не очищается память?

ОСь: linux fedora 11 64x
Perl: 10.0.1

уже мозг закипает smile

заранее спасибо
PM MAIL   Вверх
DooZ
Дата 15.4.2010, 04:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



короче проблема не решаемая... это баг или фича перла не знаю
в мануалах вообще написано, что если Вам надо очищать память (контролировать), юзайте Си smile

вообщем решил задачу банальным форком, где делается что надо, что требует память, и потом убивается этот чилд...
по другому никак

P.S. в 5.12 перле, который только вышел, этот "глюк" с очисткой, так же остался...
PM MAIL   Вверх
arto
Дата 15.4.2010, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вы можете управлять памятью через вызоб brk (man 2 brk)
PM MAIL ICQ   Вверх
Pfailed
Дата 15.4.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(arto @ 15.4.2010,  08:25)
вы можете управлять памятью через вызоб brk (man 2 brk)

А как это сделать из perl?


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


Эксперт
***


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

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



DooZ, да память мы уже исследовали, что она резервируется perl под себя и назад отдаваться не хочет
PM MAIL Jabber   Вверх
arto
Дата 15.4.2010, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



perldoc -f syscall
PM MAIL ICQ   Вверх
Pfailed
Дата 15.4.2010, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что передать brk() в качестве параметра?



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


Эксперт
***


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

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



man 2 brk
PM MAIL ICQ   Вверх
DooZ
Дата 15.4.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

#!/usr/bin/perl -w

use strict;
require 'syscall.ph';

my @templates;

open(IN, 'xxx');

    while (my $line = <IN>)
    {
    chomp($line);
    next if (!$line);
    push(@templates, $line);
    }

close(IN);

print "1\n";
----------------> 3.9% (файл 90 метров почти)
sleep(2);

print "zzz: " . syscall(&SYS_brk, \@templates) . "\n"; --------------> вылетает Segmentation fault

print "2\n";
sleep();



man 2 brk
int brk(void *addr);

2arto Вы в теории только знаете что это "нужно" сделать? или есть реальный опыт юзания очистки памяти с помощью brk именно в PERL ?
если есть, и если не затруднит, напишите пожалуйста рабочий пример...

Добавлено через 2 минуты и 11 секунд
если поставить так:
syscall(&SYS_brk, "@templates", length "@templates");

то все работает, имеется ввиду не вылетает
но памяти начинает жрать уже 8.4% smile

кто-нить подскажите как быть-то...
PM MAIL   Вверх
Pfailed
Дата 15.4.2010, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(DooZ @  15.4.2010,  17:09 Найти цитируемый пост)
если поставить так:syscall(&SYS_brk, "@templates", length "@templates");


Ну так точно неправильно. В документации к этой функции сказано что нужно передать 1 параметр, указатель типа void. Но на что именно этот указатель, а тем более как его получить в perl совершенно не ясно.
Может уважаемый arto всё же объяснит как правильно пользоваться brk(void *end_data_segment)?



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


Бывалый
*


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

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



щас perl перекомпилирую с malloc ОСи, а не его собственного, по результатам отпишусь

Добавлено через 14 минут и 30 секунд
чет все равно не помогло...
PM MAIL   Вверх
Pfailed
Дата 15.4.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

$ perl -V:usemymalloc
usemymalloc='n';



DooZ, это malloc ОС или перловый?


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


Бывалый
*


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

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



если стоит usemymalloc='n'; значит перл юзает свой malloc

я щас проверял при своем malloc при очистке того же undef @templates память первоначально жралось 3.9%, после undef 3.7% стало, т.е. он что-то очищает, но не понятно почему не все

когда я скомпилил без перлового malloc тобишь будет usemymalloc='y' при загрузке тогоже файла в @templates Он жрал уже 4.4% НО при undef @templates память так же оставалась 4.4% вот и хз как его чистить...
PM MAIL   Вверх
Pfailed
Дата 15.4.2010, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В perldoc -q "program shrinks"    примерно так и пишут, хотите почистить память  -  завершите процесс программы  smile



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


Бывалый
*


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

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



нашел тут скрипт

Код

#!/usr/bin/perl -w

use strict;
use warnings;

system "ps vp $$";

open my $fd, "<", $ARGV[0] or die $!;
my @content = <$fd>;
system "ps vp $$";

sleep(5);

undef @content;
system "ps vp $$";

sleep();



тут все очищается...
изучаю

Добавлено через 2 минуты и 33 секунды
нашел "причину" почему в скрипте все очищается
там файл создавался коммандой:
dd if=/dev/zero of=zero.dat bs=8192 count=131072

т.е. он пустой...
но если в файле будут строки (текст), то хрен что очищается

Добавлено через 4 минуты и 49 секунд
а вот так файл со строками очищается

Код

#!/usr/bin/perl -w

use strict;
use warnings;

system "ps vp $$";

local $/;
open my $fd, "<", $ARGV[0] or die $!;
my $content = <$fd>;
system "ps vp $$";

sleep(5);

print $content;

undef $content;
system "ps vp $$";

sleep();



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


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

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


 




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


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

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