我正在为我的项目开发一个全文索引系统。作为索引页面的过程的一部分,它将数据分成非常大量的非常小的部分。
我已经将这些碎片的大小设置为低至20-30字节的常量,并且可能更小,它基本上是2个8字节的整数和构成实际数据的浮点数。
由于我正在寻找的规模和创建的数量,我正在寻找一种替代mysql的方法,它在价值集上显示出远远低于我的目标的重要问题。
我目前的想法是,键值存储将是最佳选择,我已相应调整了我的代码。
我尝试了一个数字,但由于某些原因,它们似乎都比mysql更小。
我希望存储数亿或数十亿或更多键值对的顺序,因此我需要的东西不会随着尺寸而大幅降低。
我已经尝试了memcachedb,membase和mongo,虽然它们都很容易设置,但是没有一个能够很好地适应我。
由于所需的密钥数量和可用的内存有限,membase的问题最多。写入速度在这里非常重要,因为这是一个非常接近均匀的工作负载,我写了一次,然后读了几次并存储它以便最终更新。
我在删除时不需要太多性能,我希望能够很好地集群,因为我希望最终能够跨机器进行扩展,但现在需要在单个机器上运行。
我也希望这个项目易于部署,因此简单的设置会更好。该项目是用PHP编写的,因此需要从php轻松访问。
我不需要有行或其他更高级别的抽象,在这种情况下它们通常是无用的,我已经从我的其他一些测试中得到了代码,以便进入键值存储,这似乎是可能是最快的,因为我只有2个东西可以从一行键入第三个,因此几乎没有额外的工作来使用键值存储。有没有人知道任何易于使用的项目可以像这样扩展?
我正在使用这个商店存储三个数字的单独集合(大小基于它们在mysql中的存储方式,在其他存储位置可能不正确)2个8字节整数,一个用于ID的文档和一个用于单词的ID和浮动表示该单词的文档比例(工作出现的次数除以文档中的单词数)。此数据的索引是单词id和文档id所属的范围,每次我需要检索此数据时,它将是给定单词id的所有结果。我目前将单词id,范围和该单词/范围组合的计数器分别转换为数字的二进制表示形式,并将它们连接起来形成键以及一个2位数字来表示我存储的那个键的值,文档ID或浮点值。
性能测量在某种程度上主观地看待将数据放入存储或从存储中提取数据的过程的输出,并查看处理文档的速度以及快速刷新我的统计计数器以跟踪更准确的统计数据当我使用每种存储方法时,系统正在工作并查看差异。
答案 0 :(得分:5)
您需要提供更多关于您真正想要做的事情的数据......
取决于您如何定义快速大规模,您有以下几种选择:
和sooo on ..列表变得相当大..
修改1:
根据这篇文章评论,我会说你看看cassandra或伏地魔。 Cassandra不是一个简单的KV存储per se
,因为你可以存储比K -> V
更复杂的对象
答案 1 :(得分:2)
这里添加了一些上面没有提到的产品和想法:
OrientDB - 这是一个图形/文档数据库,但您可以使用它来存储非常小的“文档” - 它非常快速,高度可扩展,并且可以处理大量记录。
Berkeley DB - Berkeley DB是一个键值存储库,用于许多图形和文档数据库的核心 - 据说它具有与PHP一起使用的SQLite兼容API。
< / LI>shmop - 如果您愿意做一些肮脏的工作,共享内存操作可能是一种可能的方法。如果你的记录很小并且有一个固定的大小,这可能对你有用 - 使用固定的记录大小和用零填充。
handlersocket - 这已经开发了很长时间,我不知道它有多可靠。它基本上允许你在“较低级别”使用MySQL,几乎就像一个键/值存储。因为你绕过了查询解析器等,所以它通常比MySQL快得多。
如果你有一个固定的记录大小,很少的写入和大量的读取,你甚至可以考虑读/写平面文件。可能远没有读取/写入共享内存那么快,但它可能值得考虑。我建议您根据项目的要求权衡所有优点/缺点,不仅仅是产品,还要考虑您能想到的任何方法。您的要求并不完全是“主流”,解决方案可能不如选择正确的产品那么明显。