maco's life

最近は技術以外のことを主に記載しています。

limit,offsetを安易にrow readsが増えて大変

何十万件もあるデータで

my $limit  = 1000;
my $offset = 0;

while(1) {
    my $rs = models("Schema::Hoge")->search({},{
        limit   => 1000,
        offset => $offset, 
    });
    last if $rs->count <= 0;

    while(my $row = $rs->next) {
        #何らかの処理
        ...
    }

    $offset+= $limit
}

みたいな処理を書いていた。 この処理の意図としては、allでとってきちゃうとDBICのオブジェクトがドットメモリにのって 死ぬから1000件ずつ処理すれば安心じゃんといった狙いがあったんだけど、ここでoffsetが1000,2000,3000...と増えていくとrow readsも同様に増えていく。

数十万件もあるデータに同様の処理をするとrow readsも同様に増えて簡単にサーバーが 死んでしまいます。

学び!