2016/06/23(Thu) 23:49:45 編集(投稿者)
■No80228 (初級プログラマ さん) に返信
> ADBデータのループの中でファイルのデータをループ
こちらのAにつきまして。
ファイルの20万件のデータは、メモリに収まるようでしたら
ハッシュテーブルにあらかじめ読み込んでおいて、
キー項目の一致は、DBデータをループしてハッシュテーブルを
見に行くのが良いと思います。
また、DBのコミット間隔を大きめ(1,000件とか10,000件とか)にして
IOを減らすのが良いです。
問題は、20万件のデータがメモリに収まらない場合。
DBのキー項目にインデックスを張っておいて
ファイルのデータをループしてリストにためていって
1万件くらいになったらIN句をorでつなげてDBのデータを丸っと
where
key in (...)
or key in(...)
...
こんな感じで取得して、DBのデータをハッシュテーブルに格納して
ファイルのデータをループしてハッシュテーブルを見に行くという
やり方が考えられます。しかし、この方法だとファイルのデータをもとに
DBのデータを見に行くのでファイルにデータがなくて削除を行うというケースに
対応できないのですよね。削除がネックです。削除さえなければ。
削除しなくてもいいってことにならないかしら。
ファイルのデータがソートされていれば、DBのデータを取得するときに
DBのデータをソートして、ファイルのデータとDBのデータの双方の先頭を比較していくという
リストのマッチングが使えます。
ファイルのデータはソートされて出力されていて並べ替えちゃいけませんというように
ファイルのデータを仕様で縛ることができるとよいのですけどね。それができないとなると
メモリに収まらないデータをソートする方法を考える必要があります。これはこれでちょっと大変そう。
ということを考えました。