関数 microtimeFloat() {
list($usec,$sec) =explode(" ", microtime());
return((float)$usec + (float)$sec);
}
1. file_put_contents をテストします
$timeStart = microtimeFloat();
for ($i = 0; $i < $userCount; $i++) {
$uid =random(32);
for ($j = 0;$j < $itemCount ; $j++) {
$itemId = mt_rand(1, 300000);
$評価 = $j == 0 ? 1 : mt_rand(1, 100) / 100;
$line = sprintf("%s,%d, %sn", $uid, $itemId, $ ratings);
file_put_contents($file, $line, FILE_APPEND);
}
}
$timeEnd = microtimeFloat();
echo sprintf("滞在時間: |%s| Second(s)n", $timeEnd -$timeStart);
?>
テスト結果:
テスト中にファイルを開くときにエラーが発生し、プログラムの実行後に書き込まれたデータは不完全で、999997行のみで、3行が欠落していました。最も重要な点は、fwrite を使用した場合には 307 秒以上かかったということです。その差はまだ小さくありません。
D:myphpresearch>php test2.php
PHP 警告: file_put_contents(評価.txt): ストリームを開けませんでした: D:myphpresearchtest2.php の 79 行目で許可
が拒否されました
警告: file_put_contents(評価.txt): ストリームを開けませんでした: D:myphpresearchtest2.php の 79 行目で許可が拒否されました
所要時間: |307.0586669445| 秒
999994:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,167670,0.15
999995:98xDtLjaeD8MG9ywifegZvrRQzVBZbbw,234223,0.13
999996:98xDtLjaeD 8MG9ywifegZvRRQzVBZbbw,84947,0.79
999997:98xDtLjaeD8MG9ywifegZvRRQzVBZbbw,6489,0.38
2. fwrite をテストします
if (!$fp) die("$file を開くのに失敗しました");
for ($i = 0; $i < $userCount; $i++) {
$uid =random(32);
for ($j = 0;$j < $itemCount ; $j++) {
$itemId = mt_rand(1, 300000);
$評価 = $j == 0 ? 1 : mt_rand(1, 100) / 100;
$line = sprintf("%s,%d, %sn"、$uid、$itemId、$評価);
();
echo sprintf("所要時間: |%s| 秒n", $timeEnd -$timeStart) ;
?>
テスト結果:
約 10 秒で 100 万行のレコードを書き込みます。PHP の場合、速度はかなり良好です。これは私のパーソナル コンピュータでテストされたもので、実稼働マシンでテストすると、さらに高速になる可能性があります。
D:myphpresearch>php test2.php
所要時間: |10.764221191406|秒
999997,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,246982,0.03
999998,QOvcZYFJFlFHjiGyGyAc615kOXdX3Yii,240160,0.39
99 99 99,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,46296,0.61
1000000,QOvcZYFJFlFHjiGyGxAc615kOXdX3Yii,26211,0.14
3. まとめ
大量のデータをファイルに書き込む場合は、file_put_contents の代わりに fwrite を使用することをお勧めします。同時実行性の高いリクエストでは fwrite を使用することも推奨されます。
http://www.bkjia.com/PHPjc/328086.html
true