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

根据top,我的Julia程序可以处理14.5 GB的内存(顶部输出中的“VIRT”列),它在物理内存中的大小是7.5 GB(“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().)

最佳答案 除了马特B.和张实唯提到的那些人的局限性外,朱莉娅的传统很容易被低估.对于标题和向量盒装对象(在64位系统上),每个向量总共占用大约80个字节的空间,但是这个空间不被whos计算,并且肯定会加起来.

例如,

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

julia> whos(Test)
                          Test     80 KB     Module

这个80 KB大幅低估了Test真正使用的内存量 – 大约相当于一个数量级.因此,请检查代码中是否创建了大量小向量.

点赞