当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


erlang referenced_byte_size(Binary)用法及代码示例


referenced_byte_size(Binary) -> integer() >= 0
OTP R14B
类型:
Binary = binary()

如果一个二进制文件引用了一个较大的二进制文件(通常被说明为子二进制文件),那么获取所引用的二进制文件的大小可能会很有用。该函数可以在程序中使用来触发使用copy/1。通过复制二进制文件,可以取消引用较小的二进制文件所引用的原始(可能很大)二进制文件。

例子:

store(Binary, GBSet) ->
  NewBin =
      case binary:referenced_byte_size(Binary) of
          Large when Large > 2 * byte_size(Binary) ->
             binary:copy(Binary);
          _ ->
             Binary
      end,
  gb_sets:insert(NewBin,GBSet).

在此示例中,如果二进制内容引用的二进制内容是我们要保留的数据大小的两倍以上,我们选择在将其插入gb_sets:set() 之前复制二进制内容。当然,复制到不同的程序时适用不同的规则。

每当二进制文件被分解时,就会发生二进制共享。这就是二进制文件速度快的根本原因,分解总是可以以 O(1) 的复杂度完成。然而,在极少数情况下,这种数据共享是不可取的,这就是为什么此函数与 copy/1 一起在优化内存使用时非常有用。

二进制共享示例:

1> A = binary:copy(<<1>>, 100).
<<1,1,1,1,1 ...
2> byte_size(A).
100
3> binary:referenced_byte_size(A).
100
4> <<B:10/binary, C:90/binary>> = A.
<<1,1,1,1,1 ...
5> {byte_size(B), binary:referenced_byte_size(B)}.
{10,10}
6> {byte_size(C), binary:referenced_byte_size(C)}.
{90,100}

在上面的示例中,复制了较小的二进制文件 B ,而较大的二进制文件 C 引用了二进制文件 A

注意

二进制数据在进程之间共享。如果另一个进程仍然引用较大的二进制文件,则复制该进程使用的部分只会消耗更多内存,并且不会释放较大的二进制文件以进行垃圾回收。仅在检测到真正的问题时才使用此类侵入式函数。

相关用法


注:本文由纯净天空筛选整理自erlang.org大神的英文原创作品 referenced_byte_size(Binary) -> integer() >= 0。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。