メモ > 技術 > プログラミング言語: PHP > 巨大データの扱い
巨大データの扱い
■yield
yieldって何?PHPのジェネレータについてまとめてみた #generator - Qiita
https://qiita.com/falya128/items/53c4392b3695c12f9014
PHPのyield構文でジェネレータを使おう!サンプル付き解説 | 侍エンジニアブログ
https://www.sejuku.net/blog/74314
今回の検証用データは以下で作成する
個人情報テストデータジェネレーター
https://testdata.userlocal.jp/
以下はyieldを使わずに配列で処理するコード。
何度か実行したところ、メモリの消費量は「13.654 MB」前後となった。
// 配列で処理
function readCsv()
{
$records = [];
$file = fopen("dummy.csv", "r");
// 一行目は無視
$dummy = fgetcsv($file);
// データを取得
while ($record = fgetcsv($file)) {
$records[] = $record;
}
return $records;
}
echo "<p>実行開始:" . round(memory_get_peak_usage() / (1024 * 1024), 3) . " MB</p>\n";
$generator = readCsv();
foreach ($generator as $record) {
echo "<p>" . $record[0] . " / " . $record[2] . " / " . $record[4] . "</p>";
}
echo "<p>実行終了:" . round(memory_get_peak_usage() / (1024 * 1024), 3) . " MB</p>\n";
以下はyieldで処理するコード。
何度か実行したところ、メモリの消費量は「0.417 MB」前後となった。
// ジェネレータで処理
function readCsv()
{
$file = fopen("dummy.csv", "r");
// 一行目は無視
$dummy = fgetcsv($file);
// データを取得
while ($record = fgetcsv($file)) {
yield $record;
}
}
echo "<p>実行開始:" . round(memory_get_peak_usage() / (1024 * 1024), 3) . " MB</p>\n";
$generator = readCsv();
foreach ($generator as $record) {
echo "<p>" . $record[0] . " / " . $record[2] . " / " . $record[4] . "</p>";
}
echo "<p>実行終了:" . round(memory_get_peak_usage() / (1024 * 1024), 3) . " MB</p>\n";
上記のとおり、配列にデータを貯め続けないのでメモリ使用量を抑えて処理できる。
データベース連携も含めた検証コードが以下にある。
Dropbox\技術\PHP\yield
■その他
CSVファイルをダウンロードする機能を試作する。
大量データでメモリエラーなどになることを確認し、
「一定数取得してから結合」
を繰り返せば対応できるかも確認したい。
以下なども参考になるか。
PHPで容量の大きいデータをCSV出力するときに工夫したこと - Qiita
https://qiita.com/shosho/items/1a83ee7df82acca2274d
PHPで大容量CSV書き出しを高速で処理する - Qiita
https://qiita.com/kurosuke1117/items/112d12df6f88aaf85f10
大容量ファイルをphpでダウンロードさせる方法[自分でなんとかするWeb]
https://every-rating.com/php/php.html
【PHP】大量データをfputcsvで瞬時にCSVファイル出力する方法
https://i-407.com/blog/tech/n2/
試作したプログラムが以下にある。
技術\PHP\outputdata