2

mysql_query() から取得した結果を json 形式にエンコードする php ファイルがあります。私が受け取るデータは大きいです。つまり、200,000 に近いタプルで、各タプルには 10 に近い varchar があります。以前、「67108864 バイトの許容メモリ サイズが使い果たされました」のような例外が発生していました。次に、インターネットで検索したところ、誰かが mysql_unbuffered_query が解決策であると引用していました。私もそれを試しましたが、再び同じエラーが発生します。このような大量のデータをphpでどのように処理できますか?

共有ホスティング アカウントを持っているため、メモリを増やすこともできません。

結果を取得してjsonにエンコードするために使用しているコードは次のとおりです。

$result=mysql_unbuffered_query("Some query which gives large data");
$res=array();
if($result)
{
    while($r = mysql_fetch_assoc($result)) 
    {
        $rows[] = $r;
    }
    print json_encode($rows);

}
else
{
    echo mysql_error();
}

このような問題の回避策は何ですか?

4

1 に答える 1

2

このようなものは私が想像していたものです。クエリなどを追加するだけです.

// Must be zero to get 1st record
$limit = 0;
// Determine how many you want to pull at a time
$offset = 10;
// Run count query to get this value
$total = 10000; // <- number of records needing to be pulled
for ($limit; $limit <= $total; $limit + $offset) {
    // Run query here and pump results into an array
    echo "Total: ".$total."<br>";
    echo "offset: ".$offset."<br>";
    echo "limit: ".$limit."<br>";
}

注意:合計数がオフセットで均等に割り切れることを確認してください。そうしないと、レコードが欠落します。次に例を示します。

$offset = 19;
$total = 10000;

最後の呼び出しを次のように出力します。

合計: 10000
オフセット: 19
制限: 9994


編集:

次のテンプレートを試して、それが役立つかどうかを確認してください。元の回答を実行したときにjson_encode$limit + $offsetループforで同じメモリエラーが発生しましたが、次のビットはうまくいきました。

$offset = 10;
$total = 1000000;
$array = array();
for ($limit = 0; $limit <= $total; $limit++) {
    // Your code here
    $array[$limit] = $offset;
    // Keep the following line
    $limit = ($limit - 1) + $offset;
}
print json_encode($array);
于 2013-02-01T14:24:30.420 に答える