извлечение данных из таблицы ETS - PullRequest
3 голосов
/ 11 января 2012

Я знаю, что время поиска является постоянным для таблиц ETS.Но я также слышал, что таблица хранится вне процесса, и при получении данных ее необходимо переместить в кучу процесса.Итак, это дорого.Но тогда как это объяснить:

18> {Time, [[{ok, Binary}]]} = timer:tc(ets, match, [utilo, {a, '$1'}]).
{0,
 [[{ok,<<255,216,255,225,63,254,69,120,105,102,0,0,73,
         73,42,0,8,0,0,0,10,0,14,...>>}]]}
19> size(Binary).
1759017

1,7 МБ двоичного файла занимает 0 раз, чтобы быть извлеченным из таблицы!?

РЕДАКТИРОВАТЬ: После того, как я увидел Odobenus Rosmarus'sОтвет, я решил преобразовать двоичный файл в список.Вот результат:

1> {ok, B} = file:read_file("IMG_2171.JPG").
{ok,<<255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,
      0,8,0,0,0,10,0,14,1,2,0,32,...>>}
2> size(B).
1986392
3> L = binary_to_list(B).
[255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,0,8,0,0,
 0,10,0,14,1,2,0,32,0,0|...]
4> length(L).
1986392
5> ets:insert(utilo, {a, L}).
true
6> timer:tc(ets, match, [utilo, {a, '$1'}]).
{106000,
 [[[255,216,255,225,63,254,69,120,105,102,0,0,73,73,42,0,8,0,
    0,0,10,0,14,1,2|...]]]}

Теперь требуется 106000 микросекунд , чтобы извлечь из таблицы 101392 длинных list, что довольно быстро, не так ли?Списки по 2 слова на элемент.Таким образом, данные имеют размер 4x1,7 МБ.

РЕДАКТИРОВАТЬ 2 : я запустил тему по erlang-question (http://groups.google.com/group/erlang-programming/browse_thread/thread/5581a8b5b27d4fe1), и оказалось, что 0,1 секунды - это довольно много временитребуется сделать memcpy () (переместить данные в кучу процесса). С другой стороны, ответ Одобенуса Росмара объясняет, почему получение двоичного кода занимает 0 раз.

1 Ответ

5 голосов
/ 11 января 2012

сами двоичные файлы (длиной более 64 бит) хранятся в специальной куче вне кучи процесса.

Итак, извлечение двоичного файла из таблицы ets перемещается для обработки кучи только в части «Procbin» двоичного файла. (примерно это указатель на начало двоичного файла в памяти и размере двоичного файла).

...