我正在寻找具有以下标准的持久性解决方案(可能是NoSQL数据库?或其他...)
1)有一个Haskell API
2)磁盘空间是否有效 - 数据库可以轻松获得数GB的数据,但我需要它在典型的桌面上运行良好。我需要能够尽可能高效地存储数据的东西。因此,例如,在记录中存储字段名称会很糟糕。
3)读取连续记录的高性能。典型的用例是从某个地方开始,然后直接读取数据 - 尽可能快地读取数百万条记录。
4)数据基本上永远不会改变(只有在发现数据不正确的情况下才会更改),只记录
5)它应直接作用于易于移动/复制的文件。它不应该是一个单独的运行服务器。
答案 0 :(得分:2)
CouchDB勾选大部分方框:
1)http://hackage.haskell.org/package/CouchDB
2)取决于你如何使用它。您可以在其中存储任何二进制数据,但由您自己决定它的含义。或者您可以存储XML或JSON,这样可以降低空间效率,但随着模式的发展(将会更容易)迁移更容易。
3)不知道,但它用于大型网站。
4)CouchDB使用类似CM的概念更新和基线,因此旧数据保持不变。它可以在以后被淘汰为过时,但我认为这是可选的。
5)否。它用Erlang编写并运行(我相信)作为一个单独的过程。但为什么这是一个问题?
答案 1 :(得分:2)
如果删除“单个文件”要求而没有其他正在运行的进程,则每个标准RDBMS都可以完成其他所有操作,并且根据数据类型,有时尤其可以通过列式存储来实现特定。
我所知道的唯一单文件解决方案是sqlite。当多个并发进程需要访问单个数据库时,主要是sqlite创始人。如果情况并非如此,那么如果你能够明显扩大规模,我不会感到惊讶。
此外,如果您只是在寻找顺序扫描和键值存储,那么您可以选择berkeleydb,这对于非常大的数据集而言已知具有高性能。
有高质量的Haskell绑定用于与sqlite和berkeleydb交谈。
编辑:对于仅顺序访问,使用二进制或谷物包滚动你自己的图层也非常简单 - 你基本上需要编写一个辅助函数来顺序地从文件中读取记录而不是一次性。折叠它们的抽象也很好。然后,您可以决定附加到单个文件,或者在文件中传播您的文件。无论哪种方式,这是所有人中最轻量级和最简单的选择。唯一的缺点是不得不担心持久性 - 存在中断时的安全写入,以及良好的数据库解决方案应该为您处理的所有其他内容。