
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





![[Solved] Nginx 空のファイルがダウンロードされる nginx empty file download](https://www.yuulinux.tokyo/contents/wp-content/uploads/2022/04/Nginx_logo.svg_-150x150.png)