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

时间:2016-04-17 17:45:25

标签: julia

根据countTokens,我的Julia程序可以处理14.5 GB的内存(top输出中的“VIRT”列),它在物理内存中的大小为7.5 GB(“RES”列)。但是当我在程序中插入top的调用时,只占了大约100 MB的内存:

whos()

如何确定哪些数据结构耗尽所有内存?或者为什么没有未引用的内存被释放? (我甚至有时会明确地调用 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 。)

2 个答案:

答案 0 :(得分:1)

除了Matt B.和张实唯提到的whos的限制之外,Julia中的向量很容易在whos中被低估。对于标头和向量盒装对象(在64位系统上),每个向量总共占用大约80个字节的空间,但whos不计算此空间,并且肯定会加起来。

例如,

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

julia> whos(Test)
                          Test     80 KB     Module

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

答案 1 :(得分:1)

如果您想对您的代码进行概要分析并获得详细分析程序中内存的分配位置,Julia手册中包含大量文档。 关于分析代码的http://docs.julialang.org/en/release-0.5/manual/profile/。如果您按照这些步骤操作,则可以识别代码中发生大量分配的热点。您也可以使用@time宏,但是,如果您没有事先了解代码中的分配位置,则可能更难确定应放置宏的位置以确定分配发生的位置。