スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Perl メモリ開放うんぬん

2009年11月25日 21:49

今日、メモリ開放周りで詰まったので覚書。

100M程度のデータを変数に入れてゴリゴリやる際に
スコープから外れたのに開放されねーよ、という事態に陥ったので。

メモリ使用量はpsなりタスクマネージャなりで確認した。


create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


例えば、↑だとメモリ食いっぱなし


sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
undef $scar;
}


↑undefすれば開放。あたりまえか。


create_scar();
create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


↑これだとメモリは再利用される。

create_scar();
create_scar2();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}
sub create_scar2
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
}


↑これは倍メモリ食う


my $scar = create_scar();
sleep;

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
return $scar
}


↑これも倍


そんな感じで嵌ってました。

たぶん、再利用性の方を優先させた結果なんだろう。
まあ普通そんなでっかい領域確保しないもんね。

明示的に undef で FA

ただ、

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
$scar = substr($scar,0,10);
return $scar;
}


こういう処理のときはメンドイ

sub create_scar
{
my $scar;
$scar .= " " for ( 1.. 1000000 );
my $scar_tmp = substr($scar,0,10);
undef $scar;
return $scar_tmp;
}


こうしないと、$scarがデッカイまま。


スポンサーサイト

[覚書] strawberryperl

2009年03月17日 23:52

http://strawberryperl.com/
http://win32.perl.org/wiki/index.php?title=Main_Page

特徴
* Win32 Perl
* GCCベースなのでモジュールがCPANでスッキリ入る
* VanillaPerlがcoreプロジェクト。これにLWPとCPANモジュールを加えたもの?
* PerlFoundationのプロジェクトなので結構信頼できそう

インストール
http://strawberryperl.com/ からダウンロード
この辺
http://code.google.com/p/strawberry-perl/

ダウンロードファイルを実行して、インストール
インストール先は特に指定できず。下記に強制インストールされる模様

 C:\strawberry

strawberry配下はActivePerlと同じような感じ
exeは

 C:\strawberry\perl\bin\perl.exe

にある。
あとは環境変数「PATH」に
 C:\strawberry\perl
 C:\strawberry\perl\bin

がセットされるくらいなので、何かあればこれを消せば良い。
環境変数さえ気をつけてれば、ActivePerlと同居も問題なし


module install
cpanモジュールをインストールしてみる
コマンドプロンプトから

> cpan
cpan> install PackageName

これだけ。
さらに便利なことに、ppmコマンドも使える
cpanでライブラリ依存でうまくいかなかったとき、ppmだとすんなり入ったり

> ppm
PPM> install PackageName

なんだけど、うちの環境(Vista)でやったら、
buildディレクトリが存在しないディレクトリを指定してエラった

対処法は

PPM> set build C:\strawberry\temp
PPM> set save
PPM> set

Packages will be built under: C:\strawberry\temp

と存在するディレクトリを指定してあげればイケル


まぁとにかく便利だし、何の問題もなく動くのでActivePerlを使ってる場合ではない


LWPでmultipart/form-data

2008年12月05日 01:16

細かいところまで書いてるサイトが見つからなかったので覚書

通常のPOST処理

use LWP::UserAgent;
use HTTP::Request::Common;

my $ua = new LWP::UserAgent;
$req = POST(
                'http://localhost/test.html',
                Content-Type => 'text/html',
                Content => { foo => 'bar' },
            );
my $res = $ua->request($req);
print $res;

これを基本で

$req = POST(
                $url,
                Content-Type => 'form-data',
                Content => { foo => 'bar' },
            );

これで「multipart/form-data」でデータを作成してくれる

$req = POST(
                $url,
                Content-Type => 'multipart/form-data',
                Content => { foo => 'bar' },
            );

これでも同じ
内部的に変換してるだけ


$req = POST(
                $url,
                Content-Type => 'multipart/form-data',
                Content => {
                                       foo => 'bar' ,
                                       bar => ['./bar.txt'] ,
                                  },
            );

これで、./bar.txtをアップロード

$req = POST(
                $url,
                Content-Type => 'form-data',
                Content => [
                                       'foo' ,'bar' ,
                                       'bar' ,['./bar.txt'] ,
                                  ],
            );

Contentにはハッシュのリファレンスでも無名配列でもok
ただし若干動きが違って、無名配列だと順番が保障されます
(とあるサイトで順番を見ててハッシュで嵌った)


最終的には、こんな感じで

use LWP::UserAgent;
use HTTP::Request::Common;

http_access_lwp(
    'https://localhost/a.cgi',
    'post',
    {   Content-Type => 'text/html', },
    [
        'foo', 'bar',
        'bar', 'foo',
    ]
);

sub http_access_lwp {
    my ( $url, $method, $header_of, $content_of ) = @_;
    my $req;

    my $ua = new LWP::UserAgent;

    if ( $method =~ /^POST$/i ) {
        $req = POST( $url, %{$header_of}, Content => $content_of, );
    }
    else {
        $req = GET( $url, );
    }

    return $ua->request($req);
}




最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。