c++ - 基于图形(键/值)数据库的面向性能的设计

标签 c++ performance key-value graph-databases

我正处于为 C++ 设计基于图形(或键值)的数据库库的准备阶段,这里的许多人会发现类似于 http://neo4j.org/ 等项目。 .

由于这是一个非常早期的设计阶段,我的要求很简单,未经提炼,而且(我承认)可能仍然相当幼稚:

  • 有向无环图
    • 根少叶多的树状结构
    • 分支可能包含对其他分支的引用
    • 但没有循环
    • 该图由键值对表示,其中键和值大部分是简单类型(整数),但有些可能指更复杂的类型,例如字符串
  • 查询
    • 简单的查询通常会返回边。 IE。从此根开始的哪些边对应于(键/值/键值元组)?
    • 使用键字符串(键、键、键、值)进行查询
  • 访问模式和性能
    • 应强调快速查找
    • 添加边
    • 但没有从图中删除边/节点。 IE。该图会增长,但永远不会缩小。
    • 可以对图进行优化,以优化缓存使用的内存布局
    • 图表的大小大约为 1 MB - 2 GB,并且大部分应该适合主内存

鉴于这些粗略的要求是一项挑战,您最关心的是:

  • 内存存储:布局、分配
    • 例如固定大小的 block 池?
    • 通过聚类算法分配内存?
  • 快速查询
  • 动态重组
    • 如何处理边/节点的添加?
    • 优化更新(例如改进内存布局)
  • 并发访问
    • 例如通过优化线程处理内存布局的更改?

我正在寻找良好的起点来工作,因此我非常高兴收到对现有工作的引用。 最重要的是:我应该思考什么是我没有思考的?

最佳答案

But no cycles

如果您需要快速刃口插入,这是一个很高的要求。在最坏的情况下(其中 v 是顶点数,e 是边数),验证新边不会引入循环是 O(v+e)。它也可能排除边的并发插入。考虑将此要求设为可选。

另一种选择是区分两个插入操作:CheapInsertExpensiveInsert。让每个顶点都有一个“等级”整数,并且只允许从较低等级的顶点到较高等级的顶点进行廉价的边插入。昂贵的插入将没有此约束,并会在必要时自动重写行列。客户端可以检查和更改任何顶点的等级(只要不破坏从低到高的规则)。通过这种方式,他们可以实现自己的插入策略,可能是通过利用图的某些特定属性来避免昂贵的插入。

关于c++ - 基于图形(键/值)数据库的面向性能的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1370610/

相关文章:

c++ - C++ 的 DbUnit?

algorithm - 大O,您如何计算/近似?

python - 是否有更紧凑的方法将一系列 (key,value) 元组转换为 {key :[value, ..],..} 字典?

使用 BOOST 将 python float 转换为 c++ double

c++ - std::sort 函数有问题。在 2 轮迭代后似乎总是有 1 个元素的空值

c++ - 如果在编译时已知所有派生类,final 关键字是否提供优化?

android - 可以为两个不同的 Activity 使用相同的布局吗?

Ruby - 获取哈希值

javascript - 如何迭代数组中的特定键值对

c++ - 在 Opengl 中用球体绘制椭圆