Memo

メモ > 技術 > プログラミング言語: 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

Advertisement