中央競馬の予想や購入したもののメモなどを書いて行こうかと。まあ、個人的なメモ的なブログです。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
データベース登録処理はほぼデバッグ完了。巨大なDBファイル抱えたプロジェクトはバックアップも大変orz バックアップする場所も以前は無料クラウドに可能だったけど、このサイズは辛い。Googleドライブになんとか入れてるけど、余力が無くなった。
開発は次の段階に入った。ヒューマンインターフェースで、データ選択にTreeViewを初めて使う事にしたが、これがなかなか大変でした。結局、落ち着いたのは空のTreeNode配列を子ノード作って親ノード作成時に子ノードを持つノードを作成という感じで、最後にAddRange()でTreeViewコントロールに追加で出来た。しかし、データ量が多いので表示まで時間が掛かってしまう。なので、表示するデータ範囲を制限して時短するしかないかも。
あっ、今回ので配列の追加時に事前にサイズ指定していると、余分な配列がNullだとエラーになるので、
TreeNode tnYear = new TreeNode[0];
TreeNode tnYM = new TreeNode[0];
と宣言しておき、追加前に
Array.Resize<TreeNode>(ref tnMD, iMDcnt+1);
tnMD[iMDcnt] = new TreeNode(race.開催年月日.ToString("MM月dd日"));
Array.Resize<TreeNode>(ref tnYear, iYcnt + 1);
tnYear[iYcnt] = new TreeNode(String.Format("{0}年", iCurYear), tnMD);
Array.Clear(tnMD, 0, iMDcnt);
って感じで配列要素追加して入れる事で思った感じに出来た。親ノードに子ノード込みで作成後は子ノード配列を解放しておいた。
ふと、2回目のフルセットアップで出来た65GBのSQLite3のデータベースファイルに最適化してないな~っと思い、最適化するコーディングを追加。本日早速試してみるが、最初の1時間以上はなんも動きが見れず、ダメかな~っと放置。1時間半過ぎた位だったか、やっと何やら始まった感じではあるが、途方もない時間が掛かりそう。デバッグ時の単にファイルのコピーでも10分以上必要なんで、最適化にどの程度掛かるか予想もつきませんが、今はひたすら処理してる感じです。
SSDとかだと時間の節約は出来そうですが、HDDの性能に左右されるのは間違いないかと。うちでは普通の1TB HDDでやってるので少しでも性能が良ければ時短になるのかなぁ。でも、こんなファイルをSSDに置いたらSSDの寿命は短命確定?(笑)
ちょっと様子見ようと該当ドライブ表示してたエクスプローラに切り替えたら、"応答なし"になりましたorz データ登録に掛かった14時間程度は覚悟が必要でも不思議はないかな~。
追記
3時間ちょいで完了しました。ただ、エクスプローラは固まったままw 最適化後には59GB程度にスリム(?)化されました^^
ちと記憶が曖昧ではありますが、多分大晦日からこのエラーで悩んでました。基本、こちらのミスの筈なんですが、ひとりでじっとソース眺めてるとなかなか見つけられず、色んな事を疑う(笑) テーブル名があまりにも長いからかな~っとか、NuGet不足かな~っとか、もうね、片っ端から疑って、2日掛けてようやく自分のミス見つけました。自分のコーディングを疑って何度も見て、滅茶苦茶見つめても見つからず、でもね、本当に単に自分の見落としで見つけられないミスorz これはもう、先入観なのかマジでここまで見つけられなかった理由はね~、歳で片付けていいのかな。コマンドテキストに、結局本来の項目名とは違う項目名がってのが原因だったんですが、これ、ほんの少し違う名前だったのが盲点になったんかな^^; 見つければ、何でこれ見つけるのに数日掛かるかな~っと。グーグル先生にも沢山聞いたんですが、そもそもが根本的に基本中の基本なテーブル名とコマンドテキストが不一致ってね、頑張って見つけるしかない。先入観を簡単取り除ければ近道出来るのかも。
Visual Studioで、全てのパラメーターがNullじゃない事を確認したり、まあ片っ端から確認しても、確かにこれって見つけられない。もう少し親切にテーブルにない項目が使われてますよ~っと教えてほしいorz
つい先程、2度目のフルセットアップ開始しましたので、明日明け方には終わってる予定です。前回は12月分のデータが根本的にスルーされてたので、それも含め、時間も容量も増えるかな。でも、これが最後のフルセットアップになれば満足ではある^^
明日からはもう少し本題に入れる事を願いながらしばらく実行状況チラチラ見ておきます。
Visual Studio Community 2022でのデバッグも大分慣れてきました^^
SQLiteへのデータ登録処理のログをRich Text Boxに表示してるんですが、VSC2019と微妙に動作が違う気がする。そもそも、ログ表示用で入力は受け付けないのでReadOnlyプロパティはTrueにします。で、配置サイズを超えた出力になるとスクロールバーが出るんですが、スクロールせずに追加されていき、出力内容が手動でスクロールしないと見れないのはいただけないので、これはHideSelectionプロパティをFalseにすると実現出来ます。あと、行間が広いのが気になったのでデザイン時のプロパティでは設定出来ず、FormLoadイベントで
rtbLog.LanguageOption = RichTextBoxLanguageOptions.UIFonts;
とフォント指定すると行間が普通のテキストボックスみたいというか、VSC2019時はRich Text Boxでもテキストボックスと変わらなかったのに、VSC2022では必要らしく追加する事で回避しました。
64bit化されたVisual Studioですが、VSC2019では気になった事がなかったのに、何度かデバッグで実行して中断を繰り返すとソース編集すら重い感じがするのでタスクマネージャーで確認すると、16GB積んでるメモリの13GB位まで上がって重くなっているんですが、自分のアプリがメモリリークしてるとかの原因なのか、VSC2022がプレビューでまだ動作が微妙なのかの切り分けが出来ないorz VSC2022を終了させればメモリは解放されるので、適度に再起動してます。
やれやれ、Microsoft.Data.SqliteでなぜSystem.Data.SQLiteと同じにコーディングしてもエラーになるのかは調べる気にもならず、別のラッパー探ししてると、現状のお勧め的なものとしてSystem.Data.SQLite.Coreを発見! これ、どうやら正当なSystem.Data.SQLiteの継承者っぽいです。なんでここまで探すのに苦労してるんだろって不思議な位ですが、現在のプロジェクトにインストールした全てのラッパーを削除。NuGet ソルューションのインストール済みを空にしてまずはSystem.Data.SQLite.Coreを導入。まあね、次は本来必要のない作業だったのですが、SqliteConnectionとかにしてしまったソースを元のSQLiteConnectionに戻す。しかし、まあ、当たり前ですが、コンテキスト宣言がエラーのまま。System.Data.SQLiteの時にも確かEntityFrameworkを入れてました。これ、自分で入れた記憶がないので、System.Data.SQLiteインストール時に依存関係でインストールされたんだと思います。で、こいつは.NET6未対応だった筈で、今回のにはやはりMicrosoft.EntityFrameworkCore.Sqliteを入れる。で、これでこのまま行ければと思いましたが、やはりミグレーションが必要になるのでMicrosoft.EntityFrameworkCore.Toolsも入れ、一応、前の環境で生成してたMigrationフォルダとDBファイルは削除して、新たにAdd-MigrationとUpdate-Databaseすると普通にDBファイルは生成されました。ちと気になりDB Browser for SQLite使って中覗いでみると、う~ん、System.Data.SQLiteの時にはSQLiteらいからぬ、byte型宣言された項目はtinyintとかDateTime型がdatetimeとなる等、逆に素直に見れたのですが、今回の環境では、Microsoft.Data.Sqlite環境と同じく、SQLiteがサポートする4つの型にされてました。
これが今後データ蓄積した時にDBファイルの容量に影響するのかどうかは今となってはわざわざ調べる事はないですが、気になる所です。
で、まあ、データ登録の簡単なパーツのコンバートも終えていて、Microsoft.Data.Sqliteでエラーとなっていたものが普通にSystem.Data.SQLiteの時の様に動作してくれました。これで無事にVisual Studio Community 2022のC#での開発に戻れます。
余談ですが、このVisual Studio Commnunity 2022はうちでは未だPreview Ver.17.1.0 Preview 1.1って事ですが、確か.NET 6とC# 10になると思ってたんですが、試しにC#の新機能のnamespace1つだけなら中カッコ{}無が行ける筈と試すがNGでした。何だろ、正式版のVSC2022からかは不明です。