SQLite3へのデータ取込(記事No : 4854 投稿日 : 2022/05/03(Tue) 07:42 投稿者 : サメの餌)

タイトル SQLite3へのデータ取込
記事No 4854
投稿日 : 2022/05/03(Tue) 07:42
投稿者 サメの餌

JV-Link質問箱の方で元スレ内容からずれてしまってましたのでこちらに新たな
スレとして結果書かせて戴きます。

色々とありますが、System.Data.SQLite.Coreに

Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Tools

を追加で入れてMigrationする事でデータベースファイルを作成してましたが、
これが何やら悪さしてるっぽくてこれらを無しにしてプロジェクトを再構築。全
てのテーブルを自力でCREATE文書いて作成して接続文字列が無事通る様になりま
した。ただ、結果としては未だ13時間38分掛かってますorz 1時間程短縮はされ
ましたが、ここらが限界の様です。これ以上はデータベースの設計から見直さな
いとダメですね。1,700回以上もレコード毎にSQLiteParameter呼出してParamete
rs.ADDしてるのでこの数減らす必要がありますね。|

タイトル Re: SQLite3へのデータ取込
記事No 4855
投稿日 : 2022/05/03(Tue) 11:26
投稿者 yoshy

1,700回以上もレコード毎にSQLiteParameter呼出してParamete
rs.ADDしてるのでこの数減らす必要がありますね

・テーブル毎に更新クエリを実行する DbCommand を1つ用意する
・最初に必要な DbParameter を DbCommand.Parameters.Add() しておく
・あとはレコード毎に DbParameter の Value に値を代入して DbCommand.Exec
uteNonQuery() する

※SQLiteの場合、上記は以下の派生クラスとなります。
・DbCommand は SQLiteCommand
・DbParameter は SQLiteParameter

JV-Link質問箱 の取込高速化に書いた気がしてましたが抜けてました。|

タイトル Re^2: SQLite3へのデータ取込
記事No 4856
投稿日 : 2022/05/03(Tue) 23:43
投稿者 サメの餌

yoshyさん、こんばんは。

的確なアドバイス本当に感謝です。ちょっと修正作業でまた時間掛かりそうで
すが、一番ネックだった出走別着度数はご指摘の修正入れて試した所、え?何?1
ファイル2,500レコード程度がここまで80秒前後掛かってましたが目を疑うスピ
ードで数秒で終わってました。ちと、バグ入れ込んでないかも心配ですが、慌て
ずにきっちり修正してみます。

本当にありがとうございました。|

タイトル Re^3: SQLite3へのデータ取込
記事No 4858
投稿日 : 2022/05/06(Fri) 10:09
投稿者 サメの餌

連休使って全ての修正かけてフルセットアップしてみました。結果はまずまずで
6時間程度で終わりましたので半分以下に短縮されました。ただ、yoshyさんの30
分からは程遠いですorz

今一番時間掛かってるのは2003年から提供されている坂路調教です。これ毎月
4~5万レコード程ありますが、これが大体40秒前後掛かる感じです。8分/1年
分で19年分で2時間半を占めてます。坂路調教は項目数は少なく単にレコード数
が多いのでSQLiteへの登録が大半なんだと思いますが、SQLiteにはバルクインサ
ートとか無かった様な^^;登録処理に工夫が必要なんだとは思うけど、何かヒン
ト分かる方居ればアドバイス頂ければ幸いです。自分でも調べてみます。|

タイトル Re^4: SQLite3へのデータ取込
記事No 4859
投稿日 : 2022/05/06(Fri) 11:24
投稿者 サメの餌

自分の情報に誤りがありました。SQLiteにもバルクインサートは有る様ですね。
ちょっと実現方法等考えてみます。|

タイトル Re^5: SQLite3へのデータ取込
記事No 4860
投稿日 : 2022/05/06(Fri) 16:56
投稿者 yoshy

JV-Link質問箱のNo.6923にも書きましたが、1度DB更新をコメントアウトしてみ
てどれだけ速くなるか(=現実装での理論上の最速)を調べてみると良いかも知
れません。

DB更新以外の部分がボトルネックになっていると、いくら高速化したところで
上記より速くなることはありませんので。|

タイトル Re^6: SQLite3へのデータ取込
記事No 4861
投稿日 : 2022/05/07(Sat) 11:52
投稿者 サメの餌

バルクインサートをやってみましたが、全く成果が出ないのでご指摘の様にボト
ルネックを探してみた所、

Application.DoEvents();

がネックでした。古い習慣で、今はあまり使わないのかな?これ無しでフルセッ
トアップしてみると3時間弱とこれまたかなり改善されました。しかし、DoEven
tsのお世話で実現していたステータスバーの表示やログのスクロール、そもそも
アプリも無反応なので、その辺りの改善は必要ですが、また大きな前進が出来ま
した。ありがとうございました。|

タイトル Re^7: SQLite3へのデータ取込
記事No 4862
投稿日 : 2022/05/07(Sat) 12:36
投稿者 yoshy

JV-Linkからのデータ取得はアプリケーションのメインスレッド(UIスレッド)
上で行わないと大変遅くなります。

ただ、これだとデータ取込中はUIイベントが全く走らなくなるため、以下のよ
うな対策が必要となります。

a) Application.DoEvents()を呼び処理ループ中でUIイベントの処理を行う(現
状)

b) アプリケーションとJV-Linkのメッセージループを分け、同一プロセス内で
別スレッド化する

c) UI表示とデータ取込を別プロセスにする

JV-Link質問箱のNo.6895(取込高速化)に b) について書き込んでいます。

→JV-LinkがSTAモデルで実装されているため、COMが実行されているメイ
ンスレッド上で取込処理を動かさないとスレッド間での余分なデータ交換が発生
し死ぬほど遅くなります(ActiveXの仕様)

→別スレッドに分けたい場合は、そのスレッドをSTAで起動してJV-Linkコ
ントロールを含むウィンドウを表示し、メインアプリとは別の独自のメッセージ
ループを回します(Application.Run()する)|