2017-10-15 12 views
0

ソーシャルロボットの入ってくるビジュアルデータを、 "Subject、predicate、object"という形式のRDFトリプルとしてセマンティックメモリに保存します。どのようにこの種のデータ構造をC++でどのようにプログラムするべきか確信しています。例のエントリは次のようになりソーシャルロボットのためのRDFセマンティックネットワーク

class RDFentry { 
public: 
    int subject; 
    std::string predicate; 
    int object; 
}; 

std::vector<RDFentry> myrdf = {}; 
myrdf.push_back({i,"infront",3}); 

:「1インフロント3」要するに「subect#1空間的関係は、オブジェクト#3のインフロントである」のために私の最初の試みは、このようなものでした。私の問題は、時間枠に欠けているフィールドがあることです。このアイデアは、空間的関係だけでなく時間的な情報も記憶している。別の問題は、第4のタイムコードフィールドでは、RDFデータベース内のエントリの数が爆発するということです。通常のゲームでは、毎秒30フレームが生成されるため、プログラムが1分間実行されると、セマンティックメモリがいっぱいになります。どのように私はこれらの問題を解決するのですか?ソーシャルロボットの文脈でRDFトリプルストレージの例を示す論文はありますか?

答えて

0

timeフィールドを追加した後、我々はこのようなものを持っている:

struct RDFentry { 
    unsinged int subject; 
    std::string predicate; 
    unsinged int object; 
    unsinged long time; 
}; 

std::vector<RDFentry> myrdf; 
myrdf.emplace_back(i, "infront", 3, /*time*/); 

はそれを注意し、メモリ使用量とパフォーマンスを向上させるには:

  • 利用emplace_backの代わりpush_backを。
  • subjectobjectの最小データ型を使用します(ここではunsigned intを使用しています)。
  • 述語フィールドにいくつかの特定の値が含まれていると想定されている場合、その重い重みのstd:stringを自分のenumに置き換えることができます。
  • すでにご存知の通り、std::vectorは、連続したメモリのデータ構造です。値を挿入/削除するたびに、配列全体を新しい場所にコピーすることがあります。したがって、リンクされたリストを使用することをお勧めします。
  • RDFエントリが多すぎてプログラムのメモリに格納できない場合は、ファイル出力ストリームを設定してディスクに保存する必要があります。