EMDB is a NIF library for the Memory-Mapped Database database, aka. MDB.
The main purpose of this package is to provide a very fast Riak backend.
But this module could also be used as a general key-value store to replace:
- Erlang R14B04+
- GCC 4.2+ or MS VisualStudio 2010+
$ make
The following functions were implemented:
open/1
: equivalent toemdb:open(DirName, 10485760)
.open/2
: equivalent toemdb:open(DirName, 10485760, 0)
.open/3
: creates a new MDB database. This call also re-open an already existing one. Arguments are:close/2
: closes the databaseput/2
: inserts Key with value Val into the database. Assumes that the key is not present, 'key_exit' is returned otherwise.get/1
: retrieves the value stored with Key in the database.del/1
: Removes the key-value with key Key from database.update/2
: inserts Key with value Val into the database if the key is not present, otherwise updates Key to value Val.drop/1
: deletes all key-value pairs in the database.
$ make
$ ./start.sh
%% create a new database 1> {ok, Handle} = emdb:open("/tmp/emdb1"). %% insert the key <<"a">> with value <<"1">> 2> ok = Handle:put(<<"a">>, <<"1">>). %% try to re-insert the same key <<"a">> 3> key_exist = Handle:put(<<"a">>, <<"2">>). %% add a new key-value pair 4> ok = Handle:put(<<"b">>, <<"2">>). %% search a non-existing key <<"c">> 5> none = Handle:get(<<"c">>). %% retrieve the value for key <<"b">> 6> {ok, <<"2">>} = Handle:get(<<"b">>). %% retrieve the value for key <<"a">> 7> {ok, <<"1">>} = Handle:get(<<"a">>). %% delete key <<"b">> 8> ok = Handle:del(<<"b">>). %% search a non-existing key <<"b">> 9> none = Handle:get(<<"b">>). %% delete a non-existing key <<"z">> 10> none = Handle:del(<<"z">>). %% ensure key <<"a">>'s value is still <<"1">> 11> {ok, <<"1">>} = Handle:get(<<"a">>). %% update the value for key <<"a">> 12> ok = Handle:update(<<"a">>, <<"7">>). %% check the new value for key <<"a">> 13> {ok, <<"7">>} = Handle:get(<<"a">>). %% delete all key-value pairs in the database 14> ok = Handle:drop(). %% try to retrieve key <<"a">> value 15> none = Handle:get(<<"a">>). %% close the database 16> ok = Handle:close(). ... 17> q().
####Note: The code below creates a new database with 80GB MapSize, avoid fsync after each commit (for max speed) and use the experimental MDB_FIXEDMAP.
{ok, Handle} = emdb:open("/tmp/emdb2", 85899345920, ?MDB_NOSYNC bor ?MDB_FIXEDMAP).
For maximum speed, this library use only binaries for both keys and values.
See the impressive microbench against:
- Google's LevelDB
- SQLite
- Kyoto TreeDB
- BerkeleyDB
MDB performs better on 64-bit arch.
Should work on 32/64-bit architectures:
- Linux
- OSX
- FreeBSD
- Windows
- Unit tests
- PropEr testing
- Bulk "writing"
Volunteers are always welcome!
EMDB is Copyright (C) 2012 by Aleph Archives, and released under the OpenLDAP License.