【问题标题】:Check size in bytes of variable using Julia使用 Julia 检查变量的字节大小
【发布时间】:2015-04-08 19:00:52
【问题描述】:

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

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

【问题讨论】:

    标签: julia


    【解决方案1】:

    sizeof 也适用于变量

    sizeof(a::Array{T,N})

    返回数组大小乘以元素大小。

    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
    

    sizeof(B::BitArray{N})

    返回块;每个块是 8 个字节,因此最多可以表示 64 位

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

    sizeof(s::ASCIIString)sizeof(s::UTF8String)

    返回字符串中的字符数(1 字节/字符)。

    julia> sizeof("hello world")
    11
    

    sizeof(s::UTF16String)sizeof(s::UTF32String)

    与上面相同,但分别为 2 和 4 个字节/字符。

    julia> x = utf32("abcd");
    julia> sizeof(x)
    16
    

    据此其他strings

    sizeof(s::SubString{ASCIIString}) at string.jl:590
    sizeof(s::SubString{UTF8String}) at string.jl:591
    sizeof(s::RepString) at string.jl:690
    sizeof(s::RevString{T<:AbstractString}) at string.jl:737
    sizeof(s::RopeString) at string.jl:802
    sizeof(s::AbstractString) at string.jl:71
    

    core values

    返回每个变量使用的字节数

    julia> x = Int64(0);
    julia> sizeof(x)
    8
    
    julia> x = Int8(0);
    julia> sizeof(x)
    1
    
    julia> x = Float16(0);
    julia> sizeof(x)
    2
    
    julia> x = sizeof(Float64)
    8
    

    可能有人会想到,但请注意 Julia 字符是宽字符

    julia> sizeof('a')
    4
    

    getBytes

    适用于布局更复杂和/或不连续的情况。这是一个函数,它将遍历变量的字段(如果有)并返回所有 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
    

    【讨论】:

    • 很全面,谢谢。但是我注意到,sizeof 不适用于我自己的复合类型,例如具有Vector{Float64} 类型字段的类型将始终为sizeof 返回8,无论该字段中存储的向量的长度如何。这是否意味着我应该为每个复合类型扩展sizeof?最好的方法是简单地将sizeof 每个字段相加吗?再次感谢您的回复。
    • 我添加了一个可能对您有所帮助的功能。
    • 太棒了,一个完整的答案!
    • 两种给定的方法都不适用于 StatsBase.Weights 变量,它们是 DataType。解决方案是使用其他答案中给出的 Base.summarysize。
    【解决方案2】:

    Base.summarysize 函数正好提供了这个功能

    它还包括来自示例中的结构的开销。

    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
    

    但是,应该小心,因为该函数是非导出的,并且可能不是未来的证明

    【讨论】:

    • 谢谢,我不知道这个解决方案!尽管可能值得补充的是,这个函数是非导出的,但通常需要注意的是,这需要面向未来。
    【解决方案3】:

    在 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"..."regular expression):

    julia> varinfo(r"^v$")
      name       size summary                      
      –––– –––––––––– –––––––––––––––––––––––––––––
      v    78.164 KiB 10000-element Vector{Float64}
    

    或将Korbinian answer中的Base.summarysizeBase.format_bytes结合起来:

    julia> pretty_summarysize(x) = Base.format_bytes(Base.summarysize(x))
    pretty_summarysize (generic function with 1 method)
    
    julia> pretty_summarysize(v)
    "78.164 KiB"
    

    编辑:请注意summarysize 有一个bug,至少在 1.5.3 和 1.6.1 中。 varinfo 也会受到影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 2021-02-06
      相关资源
      最近更新 更多