为什么我的Julia程序使用了这么多内存?

为什么我的Julia程序使用了这么多内存?,julia,Julia,根据top,我的Julia程序寻址14.5gb内存(“code>top输出中的“VIRT”列),它在物理内存中的大小为7.5gb(“RES”列)。但是,当我在程序中插入对whos()的调用时,只占用了大约100 MB的内存: ArrayViews 190 KB Module Base 32427 KB Module Blosc 38 KB

根据
top
,我的Julia程序寻址14.5gb内存(“code>top输出中的“VIRT”列),它在物理内存中的大小为7.5gb(“RES”列)。但是,当我在程序中插入对
whos()
的调用时,只占用了大约100 MB的内存:

                ArrayViews    190 KB     Module
                      Base  32427 KB     Module
                     Blosc     38 KB     Module
                  Calculus    178 KB     Module
                   Celeste   4034 KB     Module
                    Compat    126 KB     Module
                      Core   3268 KB     Module
                       DOC   1241 bytes  ASCIIString
                DataArrays    936 KB     Module
                DataFrames   1817 KB     Module
             Distributions   1245 KB     Module
                    DocOpt    221 KB     Module
                    Docile    420 KB     Module
               DualNumbers     59 KB     Module
                    FITSIO    971 KB     Module
                    FileIO    592 KB     Module
               ForwardDiff    304 KB     Module
                      GZip    588 KB     Module
                      HDF5   2698 KB     Module
                       JLD    335 KB     Module
                   Logging    103 KB     Module
                      Main  46514 KB     Module
                   NaNMath    121 KB     Module
                     Optim    475 KB     Module
                    PDMats    113 KB     Module
                  Reexport   3748 bytes  Module
         SortingAlgorithms     41 KB     Module
                 StatsBase    706 KB     Module
                 StatsFuns    289 KB     Module
                       WCS     78 KB     Module
                      main   8665 bytes  Function

我怎样才能知道哪些数据结构占用了所有内存?或者为什么没有释放未引用的内存?(有时我甚至会显式地调用
gc()

以及Matt B.和张实唯, Julia中的向量在
whos
中容易被低估。对于标头和向量装箱对象(在64位系统上),每个向量总共占用大约80字节的空间,但是
whos
不计算这个空间,而且这个空间肯定可以加起来

比如说,

julia> module Test
           v = [[] for _ in 1:10000]
       end
Test

julia> whos(Test)
                          Test     80 KB     Module

这80KB大大低估了
Test
实际使用的内存量,大约相差一个数量级。因此,请检查在代码中创建的大量小向量。

如果您想分析代码并获得程序内存分配位置的详细分析,Julia手册在
在分析代码时。如果遵循这些步骤,您可以识别代码中发生大量分配的热点。您也可以使用
@time
宏,但是,如果您事先不知道代码中的分配发生在何处,则可能更难确定应该将宏放置在何处以确定分配发生在何处。

Julia不会跟踪库广泛使用的
ccall
中分配的内存。不幸的是,
gc()
也无法自动收集这些内存。(但是库应该在它们的数据结构
gc()
ed时释放它们。)
whos
中没有说明的另一个数据结构是所有JIT'ed代码的方法缓存。如果没有代码,很难说出这里发生了什么。