ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

データの検索処理を速くする

データの保持方法を変更しているけれど、悩んでいるとも書きました。
ajya.hatenablog.jp

[] = [連想配列の日付の添字 => 日付, 連想配列の特有の番号の添字 => 特有の番号, 連想配列の添字1 => データA, 連想配列の添字2 => データC]
という形式でデータを保持するように変更しました。
変更の結果、日付と特有の番号で検索して、必要な処理を行うソースコードが増えているため、
案1:
[日付][特有の番号] = [連想配列の添字1 => データA, 連想配列の添字2 => データC]
という2次元配列や、
案2:
[日付-特有の番号] = [連想配列の日付の添字 => 日付, 連想配列の特有の番号の添字 => 特有の番号, 連想配列の添字1 => データA, 連想配列の添字2 => データC]
のように、検索に使う日付と特有の番号の組み合わせの条件を添字にしてしまう案を考えました。

考えた結果を実装しようと、該当箇所を確認すると、1か所だけ日付で検索している部分があったので、案2では検索処理を新たに考えなければならず、手間がかかります。
案1での実装も考えましたが、新たな修正が発生した際に、再度データ保持方法を変更しなければならなくなるのではないかと懸念して、保留としました。

パソコンで仕事中
unsplash-logoKelly Sikkema

データを別に用意して、検索をなるべく発生させない

データ数を多くすると、処理する対象のデータの検索処理のために時間がかかるようになります。
データ数が多いのはわかりきっているので、速く検索できるようにするか、検索をしなくて済むようにしなければ、時間がかかりすぎてしまいます。

データの保持方法を
[日付][特有の番号] = [連想配列の添字1 => データA, 連想配列の添字2 => データC]
という2次元配列にやはり変更ししなければならないのかと考えつつ、変更前の元々のデータの保持方法に戻して、必要な処理をなんとか実装するしかないのかと考えていました。

考えた結果、
[日付][特有の番号] = 保持しているデータの添字
というデータを作成して、このデータを使って保持しているデータを利用する案を思いつきました。

日付と特有の番号が決まっていれば
保持しているデータ[[日付][特有の番号]]
とすれば、検索が不要になります。

日付だけ決まっていれば
foreach([日付] as 保持しているデータの添字) {
保持しているデータ[保持しているデータの添字]
}
とすれば検索の回数を減らせます。

この方法であれば、
[日付][特有の番号] = 保持しているデータの添字
を作成する際に、条件を追加して作成ができるので、追加したい条件に合致する場合だけのデータも作成できます。


思いついた案で実装を進めていき、不具合がないか検証をしていきます。