中央競馬の予想や購入したもののメモなどを書いて行こうかと。まあ、個人的なメモ的なブログです。
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
SQLiteの接続文字列で色々やってたんですが、一向に早くならなくて半ば諦めムードだったんですが、昨夜のフルセットアップでVisual Studioへの出力にふと目をやると
SQLite error (6154): os_win.c:46881: (8) winMapfile2(E:CS ProjectKSDKSD_DB.db) - このコマンドを処理するにはメモリ リソースが足りません。
と山の様にメッセージが出てる事に気が付く。今まではSQLiteConnectionStringBuilderの設定で色々と試してたんですがコネクションオープン後に地味に1つ1つPRAGMA叩く事に変更してたんです。
using (SQLiteCommand cmd = con.CreateCommand())
{
cmd.CommandText = "PRAGMA JOURNAL_MODE = WAL;";
cmd.ExecuteNonQuery();
cmd.CommandText = "PRAGMA SYNCHRONOUS = OFF;";
cmd.ExecuteNonQuery();
cmd.CommandText = "PRAGMA TEMP_STORE = MEMORY;";
cmd.ExecuteNonQuery();
cmd.CommandText = "PRAGMA MMAP_SIZE = 30000000000;";
cmd.ExecuteNonQuery();
}
で、出力されてたのが今回のエラーなんです。そもそも、今のPCは3年前位に組んでるんですが、見積もりしてもらった時には16GBx2枚でしたが、いざ購入って日に在庫切れorz お盆休み利用しての購入で入荷待つ気にはなれず8GBx2枚で妥協したのが今となって仇になった感じです。
まあ、これは仕方ないと朝から16GBx2枚を検討し探してみるとまあ1万5千円前後な感じで、仕方ないかな~っと眺めながら、数か月前にもメモリ増やそうかな~って探してた時にコロナの影響からの半導体不足で買い時じゃないな~って諦めてた時にも確か3万円以上での記憶があったんですが、Amazonにてタイムセールで32GBx2枚が3万円以下を発見!!! 大分予算オーバーだけど、明日届くって事で即決して発注しちゃいました。
過去価格: | ¥33,780 |
特選タイムセール: | ¥29,780 |
終了まで 2 日
|
|
OFF: | ¥4,000 (12%) |
データベースのノウハウ不足は否めません。日々勉強になる事が沢山あります。今回はデータベースの基本操作の登録・更新・削除で新しい機能っていうのか方法がある事を知りました。
これまでSQLite3では基本INSERTは高速で更新とか遅いって話は知っていて、該当データの存在チェックはせずに登録処理をtryで失敗時にcatchして更新かけるコーディングしてたんですが、INSERT INTO ~ ON CONFLICT() DO UPDATE ~ってまあ、コーディングしてた事をSQL文記述で行う変更をしました。これ、このUPDATE側のSETでは、INSERT側で指定したパラメータをそのまま使うEXCLUDED使う事で、今までINSERTするのにパラメータ用意して、更新時にもパラメータ用意と2度しなければならなかったのも1回で済むってのもありがたい。
前回書き込み時に触れた接続文字列は直接指定する事で効いてるかは不明だが、エラーにはなってないので、フルセットアップに再挑戦中。ただ、これ自体では然程スピードが改善されてる感じは部分テストしてみた時にはなかった。少しでも改善されていれば、日付変わる前にフルセットアップが終わると嬉しいかも。
追記 2022.4.17
まだバグが残ってたので修正してフルセットアップやり直しですorz
JRA-VANの掲示板でのやり取りで、14時間とかは問題外の遅さorz いや、別にスピードスターだとは思ってなかったけど、少し内容は違うかもだが、同じ事を30分で可能な事を14時間越えってのはねぇ。
まあ、手抜きコーディングなのは否めなくて、少し反省も含め、手を打つ事にしたのですが、これがまあ、非常に手間の掛かる作業ではありました。全テーブルへのデータ登録時の元データの処理を書き直しです。ここまでデータ提供先提供のモジュール利用して、手抜きしてたんですが、これ使わずに直にバイト配列から位置と長さ指定してデータベース登録データの指定する様に書き直す事にしました。この作業を先週夜勤明けに毎日こなして、ある程度デバッグも済ませてました。土曜日朝の夜勤明けに最後のデバックも済ませて、もう何度目かは全く把握してないフルセットアップを何とか日付変わった1時にスタートして寝ました。朝起き昼頃には終わるな~っと、昼頃の最後の段階見て愕然とした。いや、普通にバグが残ってたのは別にねぇ、自分が完璧じゃないのは驚く事ではないけど、14時間近くやった後にエラー見ると流石に辛い。
人間が作業すれば必ずヒューマンエラーがあるんですが、これが年齢的にも酷い^^; チェックしてるつもりも抜けてるなんてのは当たり前ですね。更に、今回はSQLite3の接続時の指定での効率アップも少し期待してます。ここまでは、そもそもコードファーストでEntity Framework使って楽にデータベース処理とはじめたのにコードファーストでのDBファイル作成は出来てますが、エンティティからの楽々データ登録はあまりの処理速度の遅さで採用断念し、現在のSQLを投げるものに変更する時にも膨大な時間とヒューマンエラーのデバック。コードファーストでのDB接続だったので、接続文字列なんかの知識も全く無い状態でしたので、
synchronous=off
journal mode=wal
locking_mode=exclusive
temp_store=memory
mmap_size=30000000000
を指定すると良いよってアドバイスを受けました。しかし、System.Data.SQLite.Coreでは上2つは指定方法が見つかりましたが、下3つは不明。2つ追加した状態で19時過ぎに再びフルセットアップ開始したので、明日中番の出勤前には結果が分かるかな~っと。
このPC、昨夜も夜通し動かしてましたが、今晩もこのまま行く予定です。頑張れ~!
データベース登録済みのデータ表示にDataGridViewコントロールを利用してみる事にしたのですが、最初はデータバインディングで楽にと思ってましたが、これがそうでもなく、データバインディングせずに自力でデータ表示する事にしました。
デザイン時にカラムのタイトルや幅の指定をしてたんですが、これが挙動がおかしくて苦労させられました。デザイン時に列の編集からしても、実行して諸々してると勝手に幅が変わる。そこで、フォームの.Designer.csファイルを確認すると、
this.xxx.Width = ???;
という行が何故か無い。手動で追加してデバッグするも何度かするとまた消去されるの繰り返しでした。理由は不明で20個程度ある列項目の数個に発生してました。再発怖くてデザイン画面を開けないままです^^;
この類のVisual Studioのバグとか本当にどうにかして欲しいのですが、Microsoftさん、よろしくお願いします。
ラベルコントロールにコンテキストメニューを表示して入力する方法をなかなか理解出来なかったのですが、やっと実装出来ました。コンテキストメニューを表示するのはさほど難しい話では無かったです。
ContextMenuStrip contextMenuStrip = new ContextMenuStrip();
contextMenuStrip.Items.Add("◎", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add("○", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add("▲", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add("△", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add("×", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add("注", null, new EventHandler(lblMark_Selected));
contextMenuStrip.Items.Add(" ", null, new EventHandler(lblMark_Selected));
として、これを表示したいラベルコントロールのContextMenuStripにセットするだけ。
lblMark.ContextMenuStrip = contextMenuStrip;
ただ、今回の場合はこのラベルコントロールを配列にしていてイベントハンドラーでどの様に処理するのかグーグル先生に確認しても明確な回答が得られなかった。まあ、そこで自力で解決するしかないのでデバッグ機能を利用しながら使えそうなプロパティを探り、ようやく実装に至った訳です。
private void lblMark_Selected(object sender, EventArgs e)
{
ToolStripMenuItem toolStripMenuItem = sender as ToolStripMenuItem;
ContextMenuStrip contextMenuStrip = (ContextMenuStrip)toolStripMenuItem.Owner;
Label label = (Label)contextMenuStrip.SourceControl;
label.Text = sender.ToString();
}