2017-10-15 5 views
0

Je veux enregistrer les données visuelles entrantes d'un robot social dans une mémoire sémantique comme RDF triple sous la forme "Sujet, prédicat, objet". Je ne sais pas exactement comment ce type de structure de données devrait être programmé en C++. Ma première tentative a été quelque chose comme ceci:RDF réseau sémantique pour la robotique sociale

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

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

Un exemple d'entrée serait: "1 Infront 3" en bref pour "subect relation spatiale # 1 Infront est l'objet # 3". Mon problème est, qu'il y a un champ manquant pour la période. L'idée n'est pas seulement de stocker les relations spatiales mais aussi les informations temporelles. Un autre problème est que, avec un quatrième champ de code temporel, le nombre d'entrées dans la base de données RDF exploserait. Dans un jeu normal, 30 images par seconde sont générées, donc après une minute de programme en cours d'exécution, la mémoire sémantique serait pleine. Comment résoudre ces problèmes, y a-t-il des articles qui donnent des exemples pour le triple stockage RDF dans le contexte de la robotique sociale?

Répondre

0

Après avoir ajouté champ time, nous avons quelque chose comme ceci:

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*/); 

Pour améliorer l'utilisation de la mémoire et les performances, notez que:

  • Utilisation emplace_back au lieu de push_back.
  • Utilisez le plus petit type de données pour subject et object (ici, j'ai utilisé unsigned int).
  • Si le champ de prédicat est censé contenir quelques valeurs spécifiques, vous pouvez remplacer ce poids lourd std:string par le vôtre enum.
  • Comme vous le savez peut-être, std::vector est une structure de données à mémoire contiguë, chaque fois que vous insérez/supprimez une valeur de/vers elle, il peut copier l'ensemble du tableau à quelque part de nouveau. Il est donc recommandé d'utiliser une liste chaînée.
  • Si ces entrées RDF sont trop importantes pour la mémoire de votre programme, vous devez configurer un flux de sortie de fichier et les enregistrer sur le disque.