今更ながら負荷テストと言うことで、想定されうるMAX件数のデータを展開してみる。データ作成はechoをforで回してID部分を作成(さすがに100万件作るには時間がかかった)し、sedで行末にデータを入れた。データ部分はまあ正直何でも良いので全部同じにしたけど。ただのテキストファイルも300MBともなれば結構扱いに困る。Windowsのコマンドには気軽にファイルを分割できるものがないんだよな。で、早速展開すると3万件でOutOfMemoryExceptionが飛ぶ。いやいやいくらなんでもそれは。
どっかでメモリが漏れてるんだろうなーとは思いつつ、いろいろ精査してもよくわからなかった(少なくとも自分が書いたコードではループ内でメモリ割り当て(new)してないはず)ので、やり方を変えることに。データをOracleに取り込むのにSelect→有無を判定してInsertORUpdateとやってたんだけど、ここをselect→配列に保持→Array.IndexOfで検索→InsertORUpdateと変更。若干遅くなった感じだけど、100万件くらいのデータならIndexOfでまあそれなりに何とかなるレベルみたい。もっと致命的に遅いとかなるかと思ってたけど。が、それも70万件辺りで力尽きる。今度のエラーメッセージはよくわかんない(CLRから出てる感じ)しさー。んーやはりレコード数が結構ある場合はsqlloaderでワークテーブルかなんかに一度取り込んでからなんとかするってのが定石なのかなー。まあ実運用的には1万件が降ってくることもまずありえないのでよしとすることに。問題が起きるようなら分割して送ってもらえばいいわけだし。
そういえば、(ひょっとしたらArray.IndexOfに時間がかかってるかもしれないんだけど)10万件程度のレコードをUpdateするのに15分はかかりすぎな気はするなあ。あ、ひょっとして1レコード単位でトランザクションを切ったのが原因かなこれ。そう言われてみればcommit処理って結構重たかったような……。
月曜に迷ってたもろもろをAmazonで注文。結局テクニクティクスのアレンジアルバムと太鼓の達人サントラ2008を買うことに。あとEXTRAのコンピ。近所にローソンがあるのでコンビニ受け取りにしてみた。これなら残業続きでも普通に品物が受け取れますよorz。まあ来週になっちゃうとそもそも東京にいないとかってレベルになるので(ある意味週末都民)、週末までに届いてくれないと困るなー。