0

プログラムにいくつかの動的キューがあり、処理中に要素を後ろまたは真ん中に追加/前から削除でき、処理が完了すると要素をメモリに保存することはありません.ただし、次を含むシーケンスの動的状態をログ/シリアル化したいイントロスペクションのためにすべての要素を削除しました。

例えば

    struct element1{};
    struct element2{};
    std::deque<element1> v1;
    std::deque<element2> v2;

    if(some_cond1)
    {
       v1.push_back(element1{});
       //log v1.back()
       v1.push_back(element1{});
       //log v1.back()
    }
    if(some_cond2)
    {
       v2.push_back(element2{});
       //log v2.back()
       v2.push_back(element2{});
       //log v2.back()
    }
    if(another_cond)
    {
       v1.pop_front();//presently I am not logging removal of elements
       v2.pop_front();
    }
    if(a_third_cond)
    {
       v1.insert(some_pos,element1{});
       //log v1,some_pos
    }

私は2つの代替ソリューションを検討しています。

  • 配列/オブジェクトを別の場所に分散させ、一意の名前/IDを介して参照できるようにするデータ形式(JSONなど)はありますか?私が行くようにシーケンス?

例えば

   { 
     "v1" : [],
     "v2" : [],
     append("v1"):
     [
        "elem1_v1", "elem2_v1"
     ],
     append("v2"):
     [
        "elem1_v2", "elem2_v2"
     ],
     insert("v1",1):
     [
        "elem3_v1"
     ]
   }
  • 複数の異なる場所に 1 つのファイルに書き込んで、各シーケンスが独自の場所を追跡し、その場所に書き込み、最終結果が単純な連続シーケンス記述になるようにすることは可能ですか? (私が考えることができるのは、ファイルでバックアップされた SGI ロープの実装のようなものです)

この場合、最終結果は次のようになります。

   { 
     "v1" : ["elem1_v1","elem3_v1","elem2_v1"],
     "v2" : ["elem1_v2","elem2_v2"]
   }

もちろん、大まかな方法​​で、すべての要素をフラットファイルに記録し、どのシーケンスとどこにあるかなどの情報を前に付けて、ファイル全体でそれらを検索して再構築することができます。ただし、そのような問題に対処できる場合は、より堅牢で構造化された代替手段を探しています。

4

1 に答える 1

2

あなたの最善の策は、シーケンシャルロギング(識別子付き)と後で再構築することです。

ランダム アクセス ロギングの問題は 2 つあります。

  • ランダム書き込みは、ほとんどのディスクでシーケンシャル書き込みよりもはるかに低速です
  • どのくらいのスペースを予約する必要がありますか? 疲れたらどうする?

ほとんどの場合、ロギングはアプリケーションの主な目的ではありません。調査目的で付けられています。必須ではないため、目立たないようにする必要があります。

  • 動作しません ?まあ、アプリケーションがダウンする理由はありません
  • 地獄のように遅い?まあ、アプリケーションを遅くする必要はありません
  • ...

重い作業はオフライン プロセスに任せ、データを調整します。

于 2013-01-16T07:56:17.157 に答える