[cbuilder:40106] 膨大なログファイル

45 views
Skip to first unread message

maruyama

unread,
Jul 27, 2009, 4:16:12 AM7/27/09
to cbui...@sfdata.ne.jp
丸山と申します。いつもお世話になっております。

通信ログをファイルに保存するようにしておりますが、データ受信時に
データをTreeView上にリアルタイムに作成し、1つのログデータを階層的
に表示しております。ログ保存ボタンでファイルに保存するようにして
おります。

しかし、通信ログが膨大になるとリアルタイムに操作するTreeViewが重く
なり、アプリがハングアップしたように見えてしまします。この時には、
ログ保存ボタンが効かなくなり通信ログのファイル保存ができなくなる
問題があります。

そこで、通信ログを保存する場合に、1つのデータ受信時にリアルタイム
にファイルに書き込むようにしたいと考えております。

この場合には、データ受信時にfopen,fseek(SEEK_END),fwrite,fcloseする
のが良いのでしょうか?いちいちfopen/fcloseする必要がありますか?

測定開始時にfopen,fseek(SEEK_END)し、データ受信時にfwrite,fflushする
事で対応可能と考えておりますが、大丈夫でしょうか?

fflush後に万が一アプリがハングアップし、fcloseしなくても、ファイルは
更新されているのでしょうか?

それとも全く別の方法がありますでしょうか?宜しくお願い致します。

Kanji

unread,
Jul 27, 2009, 4:34:12 AM7/27/09
to cbui...@sfdata.ne.jp
丸山さん、こんにちは。  けんたろうと申します。

私も仕事で巨大な通信ログを保存する仕事を時々行っています。
中にはPCを車載してECUとの通信ログを保存するような仕事もありますが、
車載という悪環境化の為、UPSを入れていても別の要因で突然電源が
落ちるような事もあり、いつも胃が痛い思いをしています。
そんな条件下ではありますが、幸いにもファイルが破壊された事は無く
今日まで来ております。
その方法ですが、丸山さんが書かれているように、

①プログラム起動時に fopen でファイルを開く。
 (末尾への追記なら fseek は不要だと思います)

②イベント発生毎に、fwrite で記録し、fflush で強制書き出しする。

③終了前に fclose でファイルを閉じる。

これだけですが、NTFS型のファイルシステムは、意外と堅牢みたいで
fflushを確実に実施しておけば、fclose無しに電源が落ちてもファイルが
壊れた事はありませんでした。

ただ、これがたまたま運が良かっただけなのか、本当にNTFSが高信頼性で
あったのかは、判断が付きません。

データの書き込み頻度が十分に少なければ、都度 fclose-fwrite-fcloseを
実施する方が確実だとは思いますが、fopen-fcloseはディスクに対する
オーバーヘッドが大きいように思いますので、高頻度での書き込みには
全く不向きでした。

以上です。 参考になれば幸いです。


maruyama さんは書きました:

maruyama

unread,
Jul 27, 2009, 5:08:37 AM7/27/09
to cbui...@sfdata.ne.jp
けんたろう様

早速の回答ありがとうございます。

体験を元に的確なアドバイスを頂き、
たいへん参考になりました。

Kanji さんは書きました:

酒見 義敬

unread,
Jul 27, 2009, 6:04:02 AM7/27/09
to cbui...@sfdata.ne.jp
ども(^^)/

 ログ全体はファイルにアペンドしていくとして、TreeViewの方は特定のステップ数で
 制限するってのはどうでしょう?
 例えば100ステップを越えたら古いのを削除してから新しいデータを追加すると。
 こうすればログ全体はファイルに保存されますし、直近のデータはTreeViewで
 確認も出来ます。

 そうするつもりだったと言われれば大きなお世話ですが(笑


┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌┌
酒見 義敬 <ysa...@actress.ne.jp>


Kanji

unread,
Jul 27, 2009, 7:34:17 PM7/27/09
to cbui...@sfdata.ne.jp
けんたろうです。
書き忘れた事がありましたので捕捉させて頂きます。

前回のポストで若干触れましたが、使用するファイルシステムは
FATではなくNTFSが良いと思われます。
FAT形式の時代には、しょっちゅうファイルが破壊されましたが、
NTFSになってからは全くその経験がありません。
ということで、ファイルシステムそのものがかなり強固になったと
思われます。NTFSの仕様書を読んでない為、詳細は分かりませんが。
もちろん、書き込みの真っ最中に電源が落ちたりしたら、どんな
ファイルシステムを使用しても物理故障・論理故障が避けられない
ことは言うまでもありません。
とはいえ、瞬停など電源異常が予見される場合は、UPSが必須です。


Kanji さんは書きました:

maruyama

unread,
Jul 27, 2009, 8:02:20 PM7/27/09
to cbui...@sfdata.ne.jp
酒見様

丸山です。
おっしゃるとおりだと思います。そうするつもりだったのですが・・・。

ファイル保存方法については、ソフトが重くなり操作不可能になった場合の
ログ保存の対策であり、根本的にソフトウェアが軽くなるようにする為には、
TreeViewで古いログを削除していく方法が妥当と考えております。

同様のご意見をお持ちの方がおられて、安心しました。ありがとうございます。


酒見 義敬 さんは書きました:

Reply all
Reply to author
Forward
0 new messages