使用Julia检查变量的大小(以字节为单位)

使用Julia检查变量的大小(以字节为单位),julia,Julia,问题:如何使用Julia检查变量的字节大小 我尝试过的:在Matlab中,whos()函数提供了这些信息,但在Julia中,它只提供了变量名和模块。浏览Julia手册中的标准库,sizeof()看起来很有希望,但它似乎只提供规范二进制表示的大小,而不是当前变量的大小。sizeof也适用于变量 返回数组的大小乘以元素大小 julia> x = [1 2 3 4] 1x4 Array{Int64,2}: 1 2 3 4 julia> sizeof(x) 32 julia>

问题:如何使用Julia检查变量的字节大小

我尝试过的:在Matlab中,
whos()
函数提供了这些信息,但在Julia中,它只提供了变量名和模块。浏览Julia手册中的标准库,
sizeof()
看起来很有希望,但它似乎只提供规范二进制表示的大小,而不是当前变量的大小。

sizeof也适用于变量 返回数组的大小乘以元素大小

julia> x = [1 2 3 4]
1x4 Array{Int64,2}:
 1  2  3  4

julia> sizeof(x)
32

julia> x = Int8[1 2 3 4]
1x4 Array{Int8,2}:
 1  2  3  4

julia> sizeof(x)
4
返回块;每个区块为8字节,因此最多可代表64位

julia> x = BitArray(36);
julia> sizeof(x)
8 

julia> x = BitArray(65);
julia> sizeof(x)
16
及 返回字符串中的字符数(1字节/字符)

及 同上,但分别为2和4字节/字符

julia> x = utf32("abcd");
julia> sizeof(x)
16
相应地其他 人们可能会想到,但请注意,Julia字符是宽字符

julia> sizeof('a')
4
字节数组 对于布局更复杂和/或不连续的情况。这里有一个函数,它将迭代变量(如果有)的字段,并返回所有sizeof结果的总和,该结果应为分配的总字节数

getBytes(x::DataType) = sizeof(x);

function getBytes(x)
   total = 0;
   fieldNames = fieldnames(typeof(x));
   if fieldNames == []
      return sizeof(x);
   else
     for fieldName in fieldNames
        total += getBytes(getfield(x,fieldName));
     end
     return total;
   end
end
使用它 创建一个随机类型的实例

julia> type X a::Vector{Int64}; b::Date end

julia> x = X([i for i = 1:50],now())
X([1,2,3,4,5,6,7,8,9,10  …  41,42,43,44,45,46,47,48,49,50],2015-02-09)

julia> getBytes(x)
408
该函数正好提供 它还包括来自结构的开销,如示例中所示

julia> struct Foo a; b end

julia> Base.summarysize(ones(10000))
80040

julia> Base.summarysize(Foo(ones(10000), 1))
80064

julia> Base.summarysize(Foo(ones(10000), Foo(ones(10, 10), 1)))
80920

但是,由于该函数是非导出函数,并且可能不是未来的验证函数,因此应小心。在julia 1.6中,
varinfo()
显示大小:

julia> a = 1;
julia> v = ones(10000);
julia> varinfo()
  name                    size summary                      
  –––––––––––––––– ––––––––––– –––––––––––––––––––––––––––––
  Base                         Module                       
  Core                         Module                       
  InteractiveUtils 250.022 KiB Module                       
  Main                         Module                       
  ans               78.164 KiB 10000-element Vector{Float64}
  v                 78.164 KiB 10000-element Vector{Float64}
  a                    8 bytes Int64
对于特定变量,可以使用模式匹配(
r“…”
is a):

或将from与以下内容结合使用:


编辑:请注意,
summarysize
至少在1.5.3和1.6.1中有一个<代码>VariInfo也会受到影响。

非常全面,谢谢。但是,我注意到,
sizeof
不适用于我自己的复合类型,例如,一个类型有一个类型为
Vector{Float64}
的字段,无论该字段中存储的向量的长度如何,该类型都会为
sizeof
返回
8
。这是否意味着我应该为我的每个复合类型扩展
sizeof
?这样做的最佳方法是将每个字段的大小相加吗?再次感谢您的回复。我添加了一个功能,可能会对您有所帮助。非常棒,一个完整的答案!这两种方法都不适用于数据类型为StatsBase.Weights的变量。解决方案是使用另一个答案中给出的Base.summarysize。谢谢,我不知道这个解决方案!尽管可能值得补充的是,此函数是非导出的,但通常需要注意的是,将来的校对会导致。
julia> type X a::Vector{Int64}; b::Date end

julia> x = X([i for i = 1:50],now())
X([1,2,3,4,5,6,7,8,9,10  …  41,42,43,44,45,46,47,48,49,50],2015-02-09)

julia> getBytes(x)
408
julia> struct Foo a; b end

julia> Base.summarysize(ones(10000))
80040

julia> Base.summarysize(Foo(ones(10000), 1))
80064

julia> Base.summarysize(Foo(ones(10000), Foo(ones(10, 10), 1)))
80920
julia> a = 1;
julia> v = ones(10000);
julia> varinfo()
  name                    size summary                      
  –––––––––––––––– ––––––––––– –––––––––––––––––––––––––––––
  Base                         Module                       
  Core                         Module                       
  InteractiveUtils 250.022 KiB Module                       
  Main                         Module                       
  ans               78.164 KiB 10000-element Vector{Float64}
  v                 78.164 KiB 10000-element Vector{Float64}
  a                    8 bytes Int64
julia> varinfo(r"^v$")
  name       size summary                      
  –––– –––––––––– –––––––––––––––––––––––––––––
  v    78.164 KiB 10000-element Vector{Float64}
julia> pretty_summarysize(x) = Base.format_bytes(Base.summarysize(x))
pretty_summarysize (generic function with 1 method)

julia> pretty_summarysize(v)
"78.164 KiB"