當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。