PHPは大量のデータがメモリの制限を超えない問題を処理する

2923 ワード

例えば、2つのテーブルからそれぞれ百万個以上のデータが検出された場合、これらのデータを組み合わせて別のテーブルに挿入する必要があります.配列を使用する以外にどのように処理することができますか.配列を使用すると、メモリの制限を超えないようにするにはどうすればいいですか.
 
mysql_Query関数クエリーの方法は、すべての結果をクエリーしてメモリにキャッシュすることで、スーパーメモリの現象が発生し、別の関数mysql_を使用します.unbuffered_queryはこの問題を解決できますmysqlunbuffered_queryは結果セットをキャッシュするのではなく、データをクエリーしてすぐに結果セットを操作します.つまり、クエリーを返しながら、メモリを超える現象は発生しませんがmysql_を使用します.unbuffered_queryはmysqlを使用できない時です.num_rows()とmysql_data_seek().また、MySQLに新しいSQLクエリーを送信する前に、キャッシュされていないSQLクエリーによって生成された結果行をすべて抽出する必要があります.例:
キャッシュ結果セットのコードを使用するには、次の手順に従います.
function selecttest(){        
try {            
$pdo = new PDO("mysql:host=localhost;dbname=test", 'root', '123456');//          
//$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
    $sth = $pdo->prepare('select * from test');            
    $sth->execute();            
    echo '        :' . memory_get_usage() . "
"; $i = 0; while ($result = $sth->fetch(PDO::FETCH_ASSOC)) { $i += 1; if ($i > 10) { break; } sleep(1); print_r($result); echo ' :' . memory_get_usage() . "
"; } } catch (Exception $e) { echo $e->getMessage(); } }

実行時にメモリを超えたエラーが表示されます.
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 204800000 bytes) 
in E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php on line 56Call Stack:    0.0005     135392   
1. {main}() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:0
    0.0005     135568   2. test->selecttest() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:85
    0.0050     142528   3. PDOStatement->execute() E:\ProgramDevelopment\RuntimeEnvironment\xampp\htdocs\test\test.php:56
       $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);                ,            :
144808Array(
    [id] => 1
    [a] => v
    [b] => w
    [c] => i
)
      :145544Array(
    [id] => 2
    [a] => b
    [b] => l
    [c] => q
)
      :145544Array(
    [id] => 3
    [a] => m
    [b] => p
    [c] => h
)
      :145536Array(
    [id] => 4
    [a] => j
    [b] => i
    [c] => b
)
      :145536

このとき、1つのデータメモリが返されるのは非常に小さく、700バイト以上で、メモリを超えたエラーは発生しません.