スキー滑走でログしたRTKセンサーFusionデータをC#で読み込むのに1分以上かかったので
速度向上対策をした備忘録
●WEB検索して良いブログあった
こちら様の記事で助かりました。感謝です。
【C#】ファイル読み取り速度比較
https://recruit.cct-inc.co.jp/tecblog/csharp/file-reading/
ここで、txt形式のファイルにFile.ReadAllTextを使用して読み込みが3.1msecと最速だったので
StreamReader.ReadLineが10.1msecと3倍遅いということでAllTextに替えることにしました。
●File.ReadAllTextを採用するにあたってやること
一挙に読み込んだ巨大なString(Stringの最大サイズは、オブジェクトの String 最大サイズは 2 GB、つまり約 10 億文字です。)なので、私のファイルは、1行で1KB付近なので200万行あるので、最大計測時間が2時間でも7200sec /0.12 sec =6万行なので、余裕です。
しかし、
1:CRLF区切りでSPLITして行にしてから、
2:コンマ区切りでSPLITして1行をデータ配列する
手間がかかるのでトータルして何秒かかる調べました。
●プログラム
=>ダイアログから指定のファイルofd.FileNameのファイルを見込んでstringの行単位の配列を作る
//stopwatchを使って計測してます。
swtch.Start();//計測開始
//—–readAllText—–
// シフトJISのファイルの読み込み
// memo: Shift-JISを扱うためのおまじない
System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
//alldataに全部読み込む
string alldata = File.ReadAllText(ofd.FileName,System.Text.Encoding.GetEncoding(“Shift_JIS”));
string[] sline = alldata.Split(‘[‘);//先頭に[ 文字があるのでデリミタにして分解
swtch.Stop();
sizes = sline.Length + “行,” + filesize.Length.ToString() + “byte Ellapsed Time=” + swtch.ElapsedMilliseconds.ToString() + “sec”;
label8.Text = sizes;
●結果
ファイル yomase5_COM5_20230215_123306.txt 6242KByteを読み込んで
①上記プログラム部分で 10万行を282msecで読めました。
②読んでからDataGridViewに表示する時間
これがどうしても遅くなりますが、最速でも43秒もかかりました。
これだと待ってられないので、データの表示は、ある範囲に限って、スクロールするたびに
データを読み込むという方式にしないとダメだと思います。
使ったプログラム全部はこちら
STA23_SerialMonitor_rev04.cs
https://gist.github.com/dj1711572002/abef9d4df2ede78d151770c2e04ade85