0

私は非常に大きなデータセット(正確には786,432行)を扱っています。

したがって、メモリ制限を回避するために、50,000 行の山でデータ セットをループしたいので、これをテストするために、次のことを試してみようと思いました。

function test(){
    $start = 0;
    $end = 50000;

    $q = $this->db->select('uuid')->from('userRegionLink')->limit($end, $start)->get();
    $i = 0;
    while($q->num_rows() != 0){
        echo 'Round: '.++$i.'<br />';
        echo 'Rows: '.$q->num_rows().'<br />';
        echo 'Start: '.$start.'<br />';
        echo 'End: '.$end.'<hr />';

        $start = $end;
        $end = $end+50000;
        $q = $this->db->select('uuid')->from('userRegionLink')->limit($end, $start)->get();
    }
}

しかし、私の結果は非常に奇妙です: ラウンド 9 以下を見てください。

これは何が原因ですか?

ラウンド: 1
行: 50000
開始: 0
終了: 50000


ラウンド: 2
行: 100000
開始: 50000
終了: 100000
ラウンド: 3
行: 150000
開始: 100000
終了: 150000
ラウンド: 4
行: 200000
開始: 150000
終了: 200000
ラウンド: 5
行: 250000
開始: 200000
終了: 250000
ラウンド: 6
行: 300000
開始: 250000
終了: 300000
ラウンド: 7
行: 350000
開始: 300000
終了: 350000
ラウンド: 8
行: 400000
開始: 350000
終了: 400000
ラウンド: 9
行: 386432
開始: 400000
終了: 450000
ラウンド: 10
行: 336432
開始: 450000
終了: 500000
ラウンド: 11
行: 286432
開始: 500000
終了: 550000
ラウンド: 12
行: 236432
開始: 550000
終了: 600000
ラウンド: 13
行: 186432
開始: 600000
終了: 650000
ラウンド: 14
行: 136432
開始: 650000
終了: 700000
ラウンド: 15
行: 86432
開始: 700000
終了: 750000
ラウンド: 16
行: 36432
開始: 750000
終了: 800000

4

1 に答える 1

1

$end はグローバル オフセットではなく、取得するレコード数 ($start からのオフセット) ではないようです。$end を常に 50000 に設定し、$start のみを変更するようにしてください。

于 2011-06-01T02:11:30.787 に答える