PHPは大量のデータがメモリの制限を超えない問題を処理する
2923 ワード
例えば、2つのテーブルからそれぞれ百万個以上のデータが検出された場合、これらのデータを組み合わせて別のテーブルに挿入する必要があります.配列を使用する以外にどのように処理することができますか.配列を使用すると、メモリの制限を超えないようにするにはどうすればいいですか.
mysql_Query関数クエリーの方法は、すべての結果をクエリーしてメモリにキャッシュすることで、スーパーメモリの現象が発生し、別の関数mysql_を使用します.unbuffered_queryはこの問題を解決できますmysqlunbuffered_queryは結果セットをキャッシュするのではなく、データをクエリーしてすぐに結果セットを操作します.つまり、クエリーを返しながら、メモリを超える現象は発生しませんがmysql_を使用します.unbuffered_queryはmysqlを使用できない時です.num_rows()とmysql_data_seek().また、MySQLに新しいSQLクエリーを送信する前に、キャッシュされていないSQLクエリーによって生成された結果行をすべて抽出する必要があります.例:
キャッシュ結果セットのコードを使用するには、次の手順に従います.
実行時にメモリを超えたエラーが表示されます.
このとき、1つのデータメモリが返されるのは非常に小さく、700バイト以上で、メモリを超えたエラーは発生しません.
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バイト以上で、メモリを超えたエラーは発生しません.