Database 具有URI/URL键的节省空间的地图/字典/数据库

Database 具有URI/URL键的节省空间的地图/字典/数据库,database,url,dictionary,map,uri,Database,Url,Dictionary,Map,Uri,我正在寻找一个满足某些属性的节省空间的键值映射/字典/数据库: 格式:密钥将由http(s)URI表示。这些值将是可变长度的二进制数据 大小:将有10-1000亿个唯一密钥(平均长度60-70字节)。值最初只有几十个字节,但最终可能会增长到几十KB(如果我决定存储多个版本,可能会更大)。数据的总大小将以TB或PB为单位 硬件:数据必须分布在多台机器上。此分发版应确保来自特定域的所有URI最终位于同一台计算机上。此外,机器上的数据必须根据访问频率在RAM、SSD和HDD之间分配。随着机器从集群中

我正在寻找一个满足某些属性的节省空间的键值映射/字典/数据库:

  • 格式:密钥将由http(s)URI表示。这些值将是可变长度的二进制数据
  • 大小:将有10-1000亿个唯一密钥(平均长度60-70字节)。值最初只有几十个字节,但最终可能会增长到几十KB(如果我决定存储多个版本,可能会更大)。数据的总大小将以TB或PB为单位
  • 硬件:数据必须分布在多台机器上。此分发版应确保来自特定域的所有URI最终位于同一台计算机上。此外,机器上的数据必须根据访问频率在RAM、SSD和HDD之间分配。随着机器从集群中添加或删除,数据将不得不四处移动。最初不需要复制,但以后可能会有用
  • 访问模式:我需要对数据进行顺序和(某种程度上)随机访问。顺序访问将来自连续扫描数据的低优先级批处理。在这种情况下,吞吐量比延迟重要得多。理想情况下,迭代将按字典顺序进行(即字典顺序)。随机访问是由于访问HTML页面中的URI而产生的,我希望其中大多数都指向与页面来自同一域的URI,因此将位于同一台机器上,而其他URI将位于不同的机器上。我预计每秒最多需要100000到1000000次内存随机访问。数据不是静态的。读取的频率将比写入的频率高一到两个数量级
最初,数据将由1亿到10亿个url组成,每个url有几十个字节的数据。它将托管在少量廉价的商品服务器上,这些服务器具有10-20Gb的RAM和数TB的硬盘驱动器。在这种情况下,存储键和索引信息将占用大部分空间。出于这个原因,而且由于我的预算很紧,我正在寻找一种能够将这些信息存储在尽可能小的空间中的东西。特别是,我希望利用许多URI共享的公共前缀。通过这种方式,我相信可以在比URI总长度更小的空间中存储键和索引

我研究了几种传统的数据结构(例如散列图、自平衡树(例如红黑、AVL、B)等)。似乎只有尝试(使用一些技巧)才有可能减小索引和键的大小(所有其他尝试都存储索引之外的键)。我想到的最有希望的选择是将URI拆分成几个组件(例如example.org/a/b/c?d=e&f=g类似于[example,org,a,b,c,d=e,f=g])。各个组件都会在类似于文件系统的树状结构的后续级别中索引一个子级。这似乎有利可图,因为许多URI共享相同的域和目录前缀

不幸的是,我对各种数据库产品知之甚少。我知道他们中的很多人使用B-树来索引数据。据我所知,索引和键所需的空间超过了URL的总长度

因此,我想知道是否有人可以提供一些指导,以任何数据结构或数据库,可以利用冗余的URI来节省空间。其他的东西不那么重要,但是任何帮助都会被感激的


谢谢,很抱歉这么冗长;)

根据使用情况,可能会选择存储ip地址而不是http URI的模式部分的预期寿命和质量要求。这将有一个额外的好处,即密钥前缀的长度不变(ipv4/6为32/128位)。可以使用位掩码来实现字典领域的分区。强烈的警告当然是ip和dns名称之间的映射不是静态的。