当数据不适合内存时,适用于Erlang应用程序的数据存储后端

时间:2008-11-13 15:25:03

标签: erlang mnesia data-storage dets

我正在研究如何为Erlang应用程序组织数据存储的可能选项。它应该使用的数据基本上是由短字符串ID索引的大量二进制blob集合。每个斑点都低于10 Kb,但其中有很多。我希望总共有200 Gb的大小,所以很明显它不能适应内存。对此数据的典型操作是通过其id读取blob或通过其id更新blob或添加新的blob。在每个给定的时段,仅使用一部分ID,因此数据存储访问性能可能受益于内存缓存。谈到性能 - 这非常关键。目标是在商用硬件上(例如在EC2 VM上)每秒进行大约500次读取和500次更新。

有什么建议可以在这里使用吗?据我所知,dets是不可能的,因为它仅限于2G(或者它是4G?)。 Mnesia可能也不成问题;我的印象是它主要是为数据适合内存的情况而设计的。我正在考虑尝试使用EDTK的Berkeley DB驱动程序。它会在上述情况下起作用吗?有没有人在类似条件下在生产中使用它?

5 个答案:

答案 0 :(得分:5)

tcerl面临相同的大小限制。这些天我没有使用Erlang,但这听起来像你正在寻找的。

答案 1 :(得分:1)

你看过CouchDB在做什么吗?它可能不是你所追求的产品,但是有很多用于存储数据的erlang代码。还有一些关于提供本机erlang接口而不是REST api的讨论。

答案 2 :(得分:1)

有什么理由不能只使用文件系统,将filename作为字符串ID并将文件内容视为二进制blob?您可以选择一个(文件系统),以满足您的性能要求,您应该基本上免费获得缓存,由您的操作系统提供。

答案 3 :(得分:0)

Mnesia可以将数据存储在磁盘上。还有dets(基于磁盘的术语存储),它大致类似于Berkeley DB。它位于标准库中:http://www.erlang.org/doc/apps/stdlib/index.html

答案 4 :(得分:0)

我会推荐Apache CouchDB。

它非常适合Erlang,从它的声音(你提到基于ID的blob,并没有提到任何关系要求),你正在寻找一个面向文档的数据库。

由于接口是REST,如果需要缓存,只需在其前面添加商品HTTP缓存即可。

CouchDB的文档质量非常高。

它还内置了Map-Reduce:)