PHP

2つのCSVから値の重複を抽出するパフォーマンステストしたった

PHP

 

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';

 

●計測方法

  1. target.csv, exclude.csvの空ファイル作成
  2. 配信対象ファイル作成
    $ php make_csv.php 200000
  3. 除外対象ファイル作成
    $ php make_exclude_csv.php 5000 true
  4. 比較
    $ 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

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)