Are you saying you want to know the size of the entire process running the script? On Unix-like systems, Proc::ProcessTable provides a nice API for it:
use Proc::ProcessTable;
my $t = Proc::ProcessTable->new();
foreach my $p ( @{$t->table} ) {
if($p->pid() == $$) {
print "I'm ", $p->size(), " bytes big.\n";
last;
}
}
| [reply] [d/l] |
Thanks so much for your answer.
My intention actually is to measure the total memory size of all data structure used in my script.
I'm sorry if I wasn't being clear in my OP.
Then I try this simple script, comparing it with Devel::Size.
#!/usr/bin/perl -w
use strict;
use Proc::ProcessTable;
use Devel::Size qw(size);
my @arr = ('A' .. 'M');
my $devel_size = size(\@arr);
print "With DEVEL::SIZE I'm $devel_size bytes big\n";
my $t = Proc::ProcessTable->new();
foreach my $p ( @{$t->table} ) {
if($p->pid() == $$) {
print "With Proc::ProcessTable I'm ", $p->size(), " bytes big.\n";
last;
}
}
It gives:
With DEVEL::SIZE I'm 104 bytes big
With Proc::ProcessTable I'm 5357568 bytes big.
The difference here is so big. I wonder why?
Does Proc::ProcessTable gives the size which I intend to get? If no, is there a way to achieve my original intention?
| [reply] [d/l] [select] |
As you said yourself, Devel::Size only gives you the size of a single data structure, whereas Proc::ProcessTable gives you the size of the whole running process, including perl interpreter, loaded modules etc.
That being said, 5MB seems kinda big for what you're doing here. Try EvanCarrol's suggestion as well to confirm the result, it should give you the same as Proc::ProcessTable (search.cpan.org seems to be having some problems atm, so I can't download the modules myself to check.)
| [reply] |
perl> use Devel::Size qw[ total_size size ];;
perl> print total_size( \%:: );;
[warnings omitted]
264621
perl> @a = 'A'..'M';;
perl> print total_size( \@a );;
446
perl> print total_size( \%:: );;
[warnings omitted]
265437
perl> @b{ 1 .. 100000 } = 1..100000;;
perl> print total_size( \%b );;
4813243
perl> print total_size( \%:: );;
[warnings omitted]
6803729
As you can see, the numbers don't exactly add up, but the do give you a pretty good ballpark figure.
Now, if only I can work out how to supress that dratted warning.
Update: I found it: $Devel::Size::warn=0;. With that, you can get a rough idea of where the memory your script uses is being used:
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
The "good enough" maybe good enough for the now, and perfection maybe unobtainable, but that should not preclude us from striving for perfection, when time, circumstance or desire allow.
| [reply] [d/l] [select] |
| [reply] [d/l] [select] |
| [reply] [d/l] [select] |