ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

小遣い帳ソフト(仮称)のファイル保存速度について調べてみた

現在、制作中の小遣い帳ソフト(仮称)について、

記事「
小遣い帳ソフト(仮称) アルファ版、少し修正&公開!」にて、funcHMさんからこんなコメントを頂戴しました。




(funcHMさんとのやりとりを、それぞれコメントから一部抜粋)


funcHMさん
保存の処理が少し遅い気がします。(個人的に、です)

サイバー少年
保存が遅いのは、ファイルに変更を加える際に差分だけを編集するのではなく、一からファイルを作りなおしているからだと思います。差分だけを編集するというのはかなり難しいんですよね…。

funcHMさん
難しいものを実装しようと試行錯誤するのがプログラムの醍醐味だと思います

サイバー少年
もう一度いい方法がないか考えてみます。





保存の処理が遅いということで、どうにか処理を早くできないかと、差分だけを編集するような方法を考えてみたんです。

収入、支出の記録を追加するときの処理は

新しい記録は末尾に追加されるのではなく、日付順になるように追加されますので、まずこのような処理を行います。


1. 記録ファイルを全て読みだして構造体リスト的なものに変換
2. 構造体リスト的なものを参照して、新しい記録の挿入位置を決める

ちなみに、記録ファイルは構造体リストのようなフォーマットですので、変換処理は単純にそれをC#での構造体リストに変換する処理です。


1.の記録ファイルを構造体に変換する部分は、一度でも変換を行えば後はメモリを参照するだけですので、高速ですね。

とは言っても、想定される本ソフトの使用方法が、起動して1, 2件追加して終了なので、結局は変換処理の時間が大きく影響します。

続いて、以下の処理を行います。

3. 構造体リスト的なものに新しい記録を挿入
4. 構造体リスト的なものから記録ファイルを再構築


以上なのですが、4.の工程が無駄といえば無駄なのです。

他の部分を編集しているわけではないのですから、再構築する必要は本当はありません。

そこでまぁ、構造体リスト的なものの各要素に、ファイル上のオフセットを保持させて、
挿入位置のオフセットを調べて、前半と後半に分割、新規データをサンドイッチ風に挟む…

簡潔すぎてよくわからないと思いますが、とにかく再構築しないでも可能ではあるのです。


ただ、保存時に再構築しないようにしても、読み込み時に、ファイルを構造体リストに変換する処理は最初から最後まで行わないといけません。

素晴らしい発想力の持ち主はそうでなくてもいけるんでしょうが…。


そのため、上記のような工夫をしたところで、処理する量は半分程度にしかならないのかなと思うのです。




考えているうちに、そもそも現状では巨大なファイルをどのくらいの早さで処理できるのか気になりました。


記録の説明文を全て空にすれば、x件の記録のサイズは12x + 4バイトで表せます。

もちろん、説明文を書く場合、文字列のサイズは大きいので大きなファイルとなりますけどね。

巨大といっても、現実の範囲内では、それほど大きなファイルにはならないわけですね。


というわけで、20000件あるファイル(約500KB)を作って、さらに記録を追加させてみました。

20000件というとなかなかの量です。
用途が小遣い帳なので、お金の出入りが激しい人でも一日10件程度でしょう。

1日10件、365日絶えずに記録したとしても、20000件に到達するには5年以上かかります。

そのため、20000件のファイルが相手でもそれなりの速度で追加できるなら、現状のプログラムでもいいのだろうと考えました。


まぁしかし、予想としては追加するたびに3, 4秒程度の遅延が発生するのかなと思っていたのですが…



予想より早かった!
なんと、一件の追加ごとに遅延は体感で0.3秒ほどでした。


今までの考察は何だったんだという…。



というわけで、現状のままで問題ないだろうと思います。

funcHMさん、処理速度が遅いのは、パソコンが遅いのです…。

tag: 自作ソフト 小遣い帳ソフト(仮称) 処理速度

コメント

>funcHMさん、処理速度が遅いのは、パソコンが遅いのです…。

そうかもしれない・・・、僕がこのソフトを動かした環境は メインメモリ: 2GB×2 (それなりに、だと思います)で、その環境で動かした結果 かなり遅かったので、コメントしました。

しかしこのpc 5,6年近く使っていて 劣化してるかも(というかしてるねw)

どうやら劣化しているのを考慮しないでコメントしてしまったようです、混乱させてしまって、すいません・・・。

できれば低スペPCも考慮してくだs

  • 2014/06/04(水) 18:54:06 |
  • URL |
  • funcHM #-
  • [ 編集 ]

Re: funcHM

いえいえ、確実性がなくても気になったことは言ってくださるほうが、私としてもありがたいです~。

5,6年前のものですか。
私のPCのほうが古いです(笑)

「パソコンが遅い」と書いてみたものの、ひょっとして原因は他にあり、それで遅かったのかもしれませんね。
同時実行しているタスクの量が多いなど、環境が悪いせいで遅くなったということもありますし。

まぁ、それなりの余裕を持った環境で行えば、気にならない程度の速度で処理できるはずです。

低スペPCというとほとんどがWindows XPマシンなわけですが、XPのサポートが切られてPCの買い替えが進んだのは好都合ですね。

OSだけ入れ替えた人は…しらん。

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/346-9d91ab72
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。