2つのCSVから値をO(n^2)で比較するパフォーマンステストやったった🐱
配列の比較は数万件レベルの共通項抜き出す程度だったら20万件程度なら問題ならないね。
もくじ
●対象数 作成スクリプト
make_csv.php
<?php class CsvService { /** * CSVのサンプルファイル作成 * * @param string $file_name * @param int $max */ public function makeCsv(string $file_name, int $max) { $datas = []; for ($i=0; $i < $max; $i++) { $datas[] = [ 'メールアドレス' => uniqid() . "@example.net", //'パスワード' => "password", //'管理名' => uniqid(), ]; } // ファイル取得 $fp = fopen($file_name, 'w'); // CSV書き込み foreach ($datas as $data) { $row = implode(',', $data); fwrite($fp, $row . "\n"); } } } $s_csv = new CsvService(); // コマンドラインから実行 // ex. 1,000レコードのサンプルCSVファイルを作成 $ php make_csv.php 1000 $s_csv->makeCsv("target.csv", $argv[1]);
●除外数作成スクリプト
make_exclude_csv.php
<?php // 除外数 $max = $argv[1]; $is_dummy_setting_enable = $argv[2] ?? false; $f_target = fopen("./target.csv", "r"); while ($target_line = fgetcsv($f_target)) { $target_array[] = $target_line[0]; } $fp = fopen("./exclude.csv", 'w'); $data = []; for ($i=0; $i < $max; $i++) { if ($is_dummy_setting_enable && rand(1,2) === 1) { // ダミー $data[] = uniqid() . "@dummy-example.net"; } else { $data[] = $target_array[rand(1, count($target_array))]; } $row = implode(',', $data); fwrite($fp, $row . "\n"); $data = []; }
●比較スクリプト
<?php // start $start_time = microtime(true); $f_target = fopen("./target.csv", "r"); $f_exclude = fopen("./exclude.csv", "r"); $target_array = []; while ($target_line = fgetcsv($f_target)) { $target_array[] = $target_line[0]; } $exclude_array = []; while ($exclude_line = fgetcsv($f_exclude)) { $exclude_array[] = $exclude_line[0]; } //var_dump($target_array); //var_dump($exclude_array); $result = array_values(array_intersect($target_array, $exclude_array)); print_r($result); // end echo '対象数: ' . count($target_array); echo "\n"; echo '実際の除外対象数: ' . count($result); echo "\n"; echo'-----------------'; echo "\n"; $end_time = microtime(true); echo $end_time - $start_time . 'ms';
●計測方法
- target.csv, exclude.csvの空ファイル作成
- 配信対象ファイル作成
$ php make_csv.php 200000 - 除外対象ファイル作成
$ php make_exclude_csv.php 5000 true - 比較
$ php csv_performance_test.php
結果
対象数: 10000 実際の除外対象数: 20 ----------------- 0.010869979858398ms 対象数: 200000 実際の除外対象数: 20 ----------------- 0.20706391334534ms 対象数: 200000 実際の除外対象数: 100 ----------------- 0.20505285263062ms 対象数: 200000 実際の除外対象数: 998 ----------------- 0.21547412872314ms 対象数: 200000 実際の除外対象数: 9748 ----------------- 0.26504898071289ms 対象数: 200000 実際の除外対象数: 44413 ----------------- 0.51848101615906ms