Was {ram_file, true} option to dets:open_file() once a good idea?

Scott Lystig Fritchie <>
Wed May 1 06:35:37 CEST 2002


Reading the docs for dets, I see this in the discussion of
dets:open_file/2:

    {ram_file, bool()}, whether the table is to be kept in RAM. Keeping
    the table in RAM may sound like an anomaly, but can enhance the
    performance of applications which open a table, insert a set of
    objects, and then close the table. When the table is closed, its
    contents are written to the disk file. The default value is false.

However, when I use it to simply insert a bunch of tuples into a dets
table, the result is about twice as slow (if not even worse) as if I
omit it/set it to false.

Was this option a good idea once upon a time?  On my 500MHz Pentium
III laptop, adding 800,000 tuples with {ram_file, false} takes 3
minutes.  I aborted adding 500,000 tuples with {ram_file, true} after
7 min 30 seconds.  Perhaps it's a good option to use when the file
system is on a floppy disk or a *really* busy hard drive circa 1990?

-Scott

---

% Timed via: time erl -run test dets {N} true|false -run erlang halt

-module(test).
-export([dets/1, dets/2]).

dets([S, RamFile]) ->		   % erl -run test dets N true|false
    dets(list_to_integer(S), list_to_atom(RamFile)).

dets(N, RamFile) ->
    io:format("dets starting inserting ~w objects\n", [N]),
    T = dets_test,
    file:delete(atom_to_list(T)),
    {ok, T} = dets:open_file(T, [
				 {estimated_no_objects, N},
				 {ram_file, RamFile}
				]),
    dets_insert(T, N),
    ok = dets:close(T),
    io:format("dets done inserting ~w objects\n", [N]),
    ok.
    
dets_insert(T, 0) ->
    ok;
dets_insert(T, X) ->
    K = <<X:32>>,
    X2 = X * 2,
    V = <<X2:32>>,
    ok = dets:insert(T, [{K, V}]),
    dets_insert(T, X - 1).




More information about the erlang-questions mailing list