繁体   English   中英

从ETS表中检索数据

[英]retrieval of data from ETS table

我知道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 MB二进制文件从表中检索0次!?

编辑:在我看到Odobenus Rosmarus的答案后,我决定将二进制文件转换为列表。 结果如下:

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|...]]]}

现在从表中检索1986392长list需要106000 微秒 ,这是非常快的,不是吗? 列表是每个元素2个单词。 因此数据为4x1.7MB。

编辑2 :我在erlang-question( http://groups.google.com/group/erlang-programming/browse_thread/thread/5581a8b5b27d4fe1 )上开始了一个主题,事实证明0.1秒几乎是需要花费的时间memcpy()(将数据移动到进程的堆中)。 另一方面,Odobenus Rosmarus的答案解释了为什么检索二进制需要0次。

二进制文件本身(超过64位)存储在进程堆外部的特殊堆中。

因此,从ets表中检索二进制文件只会将'procbin'部分转换为二进制文件。 (粗略地说它指向二进制文件内存和大小的二进制开始)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM