MIT’s blog

個人的なメモかな

1時間の短縮

今朝起きてみると、フルセットアップが終了してました。13時間38分と1時間程度短縮されてました。ここまでの苦労に見合うかは別として、まだまだなのは確かです。ただ、今回の諸々の変更で、データベースファイルのサイズが60ギガ→40ギガにサイズダウン。ん?大丈夫か?って感じです。簡単に検証出来ないので、無事に全てのデータが問題なく登録出来ているかが心配なくらいです。単にこれがMicrosoft.EntityFrameworkCore系の悪事からの解放の結果なら良いのですがね。

 

データベースファイルサイズが落ちた副産物は最適化が4時間近く掛かってたと思うのが2時間弱で済んでました。まあ、最適化は頻繁にはやらないかとは思うけど、半減してるのはありがたい。

 

更なる改善と開発を進めるしかないですね。

SQLiteの接続文字列がまだまだ勉強不足

まだまだ色々と分かってないとは思うけど、データベース新規作成時に指定しておくものと、毎回指定しなきゃなものがある気がする。毎回メモリの指定するとしばらくしてリソース不足のエラーが出始めるので、これは何となく作成時のみにしておく。ジャーナルモードは毎回メモリとかしないと気が付くとジャーナリストファイルが出来てるのを目視出来ます。

PRAGMA JOURNAL_MODE = MEMORY;
PRAGMA TEMP_STORE = MEMORY;

これらは毎回指定する様にしてみました。これで久しぶりにフルセットアップ開始してみたので明日の明け方には終わるのかな^^;

接続文字列指定で出ていたエラーは無くなりましたが、根本的なスピードアップにはなってませんのでまだまだ学習して改善して行くしかないかも。

少しずつだが

SQLiteの接続文字列でのdatabase is lockedな問題だけど、なぜ起きているのか不明な感じではあるが、疑わしいのはMicrosoft(笑) そもそも、この会社何? YESかNOかで言えば、確実にNOなんだが、今のPCではってか、今でもlinuxへの逃げやChromeなんかがあるにしてもMS必須なんだよね~orz で、疑ったのは

Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools

の謎w 中途半端なこれらのおかげで随分と苦労している気がして、今回、新たに別プロジェクトを作成してMicrosoftの妨害を阻止してみました。

System.Data.SQLite.Core

これ1本のみでの開発に挑戦してみようかと作業を進めています。つまり、Migration無しで自力でデータベース構築する訳ですが、まあ、CREATE文を全てのテーブル分用意すれば良い訳ですが、これもまた、かなりの作業です。一番気になっている出走別着度数テーブルの1,700項目超えなんですが、ここは既に済ませ接続文字列で色々テストすると、これまでのdatabase is lockedは消えました^^ でもね、処理スピードは不変orz

それでも、database is lockedの犯人はMicrosoftなのは確定です。


接続文字毎の結果

取敢えず、何も指定しないデータベースのパスのみだと

2022/04/28 10:23:07 出走別着度数(2,445) [2022/03] >> Done! ...79.2959801秒
2022/04/28 10:24:26 出走別着度数(1,276) [2022/03] >> Done! ...41.2450401秒

PRAGMA TEMP_STORE = MEMORY;

2022/04/28 10:29:22 出走別着度数(2,445) [2022/03] >> Done! ...80.8131174秒
2022/04/28 10:30:42 出走別着度数(1,276) [2022/03] >> Done! ...41.9937788秒

PRAGMA JOURNAL_MODE = WAL;

2022/04/28 10:34:43 出走別着度数(2,445) [2022/03] >> Done! ...80.604067秒
2022/04/28 10:36:03 出走別着度数(1,276) [2022/03] >> Done! ...41.9658116秒

PRAGMA JOURNAL_MODE = OFF;

SQLite error (5): statement aborts at 1: [PRAGMA JOURNAL_MODE = OFF;] database is locked

PRAGMA JOURNAL_MODE = MEMORY;

SQLite error (5): statement aborts at 1: [PRAGMA JOURNAL_MODE = MEMORY;] database is locked

PRAGMA SYNCHRONOUS = OFF;

2022/04/28 10:46:05 出走別着度数(2,445) [2022/03] >> Done! ...81.065699秒
2022/04/28 10:47:26 出走別着度数(1,276) [2022/03] >> Done! ...42.1620051秒

PRAGMA LOCKING_MODE = EXCLUSIVE;

例外として

ちと、JOURNAL_MODE = OFF | MEMORY の場合はVisual Studioの出力タグに延々と上のメッセージが出るので強制終了させてるんですが、これは例外で止まる。しかも、随分と待たされた後にトランザクション開始で起きる^^;

PRAGMA MMAP_SIZE = 30000000000;

2022/04/28 11:01:39 出走別着度数(2,445) [2022/03] >> Done! ...78.8158052秒
2022/04/28 11:02:58 出走別着度数(1,276) [2022/03] >> Done! ...41.0700406秒

PRAGMA CACHE_SIZE = 500;

2022/04/28 11:15:15 出走別着度数(2,445) [2022/03] >> Done! ...80.738003秒
2022/04/28 11:16:36 出走別着度数(1,276) [2022/03] >> Done! ...42.4018137秒

PRAGMA PAGE_SIZE = 32768;

2022/04/28 11:19:52 出走別着度数(2,445) [2022/03] >> Done! ...80.382808秒
2022/04/28 11:21:12 出走別着度数(1,276) [2022/03] >> Done! ...41.6193615秒

個別指定ではどれも誤差レベルなんだけど、MMAP_SIZEだけ若干って感じ。これらをどんな感じで組み合わせると良くなるのか、それともエラーにならないもの全てなのか、database is lockedを解消して効果絶大ってLOCKING_MODE辺りを入れれる様にしなきゃなのかGW使って調べるかなぁorz

SQLiteの接続文字列

そもそも、データベースのパスだけしか指定はしてなかったんですが、あちこちで接続文字列で色々指定するとパフォーマンスが上がるって事で試してるんですがなかなか上手く行きません。

PRAGMA LOCKING_MODE = EXCLUSIVE;

DB Browser for SQLiteではエラー無く実行出来ましたってなるのは確認済みですが、これを指定すると

database is locked

ってなります。これ、

PRAGMA JOURNAL_MODE = MEMORY;

してもなるんだよね^^;データベースがロックされたのを解除するとかの話もいくつか見ましたが、な~んか違うんだよな。

PRAGMA SYNCHRONOUS = OFF;
PRAGMA JOURNAL_MODE = WAL;

の2つでもパフォーマンスが上がるって話も見かけましたが、今回の僕のデータベースには効果無しです。しばらく色々試してみる必要がありそうです。

メモリ不足解消するが速度は変わらず

本日32GBx2枚が届いたので早速PCに組込後、試してみるがメモリ不足は解消されているが速度は全く変わらずでした。OSで64GB認識されているので問題ないとは思うけど、まあ、そのうちにOSのインストールからやり直してみるかもですが、SQLiteの処理が遅いのはもう手詰まりorz 接続文字列も色々と試しましたが変化なし。

ちと、出来る範囲のシェイプアップはしてみるつもりなのと、根本的にシンプルなループで回せる事と沢山の引数連れた飛び回りを減らしてみるしかないかな~っと。現在は取り込んでいるデータをステータスバーに表示してるんですが、試しに表示無しにすると81秒が76秒とか5秒短縮されてましたが、これは対価として76秒間ひたすらプログレスバーが伸びるの見るだけなんですよね。まあ、1か月分のデータ取込で7秒程度短縮されると84秒/年で、18年だと25分の短縮なのは大きいとみるべきなのか。9時間が8時間半ちょいは十分とみるのか本当に微妙です。まあでも、そんな感じでシェイプアップ進めるしかないですね。

 

追記 2022.4.27
64GB積んだ状態でもメモリリソース不足は出ました。

PRAGMA MMAP_SIZE = 30000000000;

が原因だと思うけど、これ単純に30GBって事なのかな?う~ん、わからないorz

メモリ不足

SQLiteの接続文字列で色々やってたんですが、一向に早くならなくて半ば諦めムードだったんですが、昨夜のフルセットアップでVisual Studioへの出力にふと目をやると

SQLite error (6154): os_win.c:46881: (8) winMapfile2(E:\CS Project\KSD\KSD_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万円以下を発見!!! 大分予算オーバーだけど、明日届くって事で即決して発注しちゃいました。

Team DDR4 2666Mhz PC4-21300 32GBx2枚(64GBkit) デスクトップ用メモリ Elite Plus シリーズ 日本国内無期限保証 正規品

過去価格: ¥33,780 詳細
特選タイムセール: ¥29,780  翌日配送
 
終了まで 2 日
OFF: ¥4,000 (12%)