2

私はそのような2つの構造体を持っています:

public struct KeyLog
{
    Keys key;
    DateTime time;
}

public struct MouseLog
{
    MouseEvents mouse;
    Point coordinates;
    DateTime time;
}

キーボードのキーを押してマウスボタンをクリックするたびに、このデータを保存したいのですが、どの方法でデータを保存/処理するのが最も効率的かわかりません。データを処理するためのより良い方法はありますか?2つの構造体を使用する方が両方を1つにマージするよりも優れているかどうかはわかりませんか?

編集:私はキーボードとマウスの統計アプリケーションを実行しています。このアプリケーションは、キーの押下とマウスのクリックの量、および押されたボタン、コンピューターの場所とタイミングを保存し、ボタンを押すたびにこのデータを保存したいと考えています。が押されました。毎回ディスクに書き込む必要はありませんが、ディスクに保存するまで、少なくともメモリに保存してください。

編集: 2つの構造体を分離しておくと、保存するときにデッドデータがあまり作成されないので、分離しておくと簡単に検索/並べ替えることができると思いました。考え?

4

7 に答える 7

2

BinaryFormatterは、最小の圧縮を提供しますまた、それらをクラスに変更すると、フィールドを持つ基本クラスを持つことができDateTime timeます。

于 2010-01-15T15:39:16.897 に答える
1

それらをマージすると、プログラミングが容易になります。

ディスクスペースの節約をより意識しているので、

MouseLogとKeylogのジェネリックコレクションを使用できます

例:メモリ内表現のリストリスト

ディスクに書き込む場合は、クラスに入れて1つの大きなオブジェクトとして保存できます。

お気に入り

  [serializable]
    class BigObject 
    {

    List<Mouselog> MouseLogLst;


    List<KeyLog>  KeyLogLst ;

    }

BinaryFormmaterを使用 してそれらを保存します

于 2010-01-15T15:48:46.767 に答える
1

私はそれを非常に単純なデータアクセス層を備えたバイナリファイルに順番に保存することがよくあります。ここで使用できるアプローチはいくつかありますが、私はこれが最も好きです。かなりシンプルで高速です。ファイル内のエントリへのインデックステーブルを非常に簡単に作成することもできます。

class Foo {
  private int _someInteger;
  private string _someString;

  public virtual void Serialize(BinaryWriter writer) {
    writer.Write(2); // A simple versioning, start at 0, then increment.
    writer.Write(_someString);
    writer.Write(_someInteger);
  }

  public virtual void Deserialize(BinaryReader reader) {
    int version = reader.ReadInt32();
    switch (version) {
      case 2: // the string was only added in version 2 of the class serialization.
        _someString = reader.ReadString(); 
        goto case 1;
      case 1: // continue at case 1.
        _someInteger = reader.ReadInt32();
        break; // break here, because version 0 was very different.
      case 0: // in version 0 of the class there was actually a double, but it was always an integral number, so this basically is a conversion case.
        _someInteger = (int)reader.ReadDouble();
        break;
    }
  }
}

書き込むのと同じ順序でファイルから読み取るように注意してください。

次に、ストリームからリーダーとライターを渡すことができます。

Foo fooInstance = new Foo();
FileStream fileStream = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader reader = new BinaryReader(fileStream);

fooInstance.Deserialize(reader);

これは非常に単純であり、常に問題を引き起こす愚かなXMLシリアライザークラスのset-accessorsを使用してすべてのフィールドとプロパティを公開する必要はありません。

于 2011-07-01T14:56:51.070 に答える
0

それらを分離しておく正当な理由がない限り、それらをマージする必要があります。KISSはここに当てはまると思います。

于 2010-01-15T15:38:41.067 に答える
0

えーと……どこに保管する予定ですか?参照できるメモリ内ログが必要な場合は、aList<X>で十分です。

ディスクにストリーミングする場合は、シリアル化する必要があります。バイナリシリアル化は総ディスク容量の点で最も効率的ですが、XMLシリアル化は「人間が読める」ものです。

次に、データベースストレージがあります...

于 2010-01-15T15:38:45.943 に答える
0

プログラマーとしての時間を節約できる可能性が高いため、1つの構造体に格納します。特に後でファイルを保存/ロードする場合は、処理が簡単になります。あなたが説明した構造体を使用することから得られるものはほとんどありません。

そして、それがパフォーマンスの問題になる場合は、コードのプロファイルを作成してボトルネックがどこにあるかを確認し、それらを修正します。

于 2010-01-15T15:39:31.280 に答える
0

Unicodeについて心配する必要がありますか、それともASCIIにすることができますか?XMLはあなたの友達だと思います。2つをマージしないでください。ただし、両方とも抽象EventLogの子である両方のクラスを作成してください。EventLogクラスは、toString()メソッドを強制する必要があります。おそらく他のいくつかのメソッドです。次に、EventLogのリストを作成します。各EventLogはKeyLogまたはMouseLogです。あなたは車輪の再発明をしているのだろうか...

于 2010-01-15T15:39:57.413 に答える