Memory 朱莉娅:高效的内存分配

Memory 朱莉娅:高效的内存分配,memory,julia,Memory,Julia,我的程序内存不足,所以我需要尽可能多地保存内存。 将整数值赋给变量时,值的类型将始终为Int64,无论是0还是+2^63-1或-2^63。 我找不到有效分配内存的智能方法,所以我编写了一个如下的函数(在本例中为整数): 但我认为这不是一个好办法 我还有一个相关的问题:什么是不用担心typemins和typemaxs的数字操作的有效方法?将每个操作数转换为BigInt,然后应用right\u int?您缺少树的林右\u int是类型不稳定的。类型稳定性是减少分配和提高速度的关键概念。通过尝试“调整

我的程序内存不足,所以我需要尽可能多地保存内存。 将整数值赋给变量时,值的类型将始终为Int64,无论是0还是+2^63-1或-2^63。 我找不到有效分配内存的智能方法,所以我编写了一个如下的函数(在本例中为整数):

但我认为这不是一个好办法


我还有一个相关的问题:什么是不用担心typemins和typemaxs的数字操作的有效方法?将每个操作数转换为BigInt,然后应用right\u int?

您缺少树的林<代码>右\u int是类型不稳定的。类型稳定性是减少分配和提高速度的关键概念。通过尝试“调整”整数的大小以节省空间,实际上会导致更多的分配和更高的内存使用。作为一个简单的例子,让我们尝试制作一个“大小合适”的数组,其中包含1-100之间的100个整数。它们都足够小,可以放入
Int8
,所以只有100字节加上数组头,对吗

julia> @allocated [right_int(i) for i=1:100]
26496
哇,26496字节!为什么不起作用?为什么会有这么多的开销?关键是Julia无法推断出
right\u int
的类型,因此它必须支持返回的任何类型:

julia> typeof([right_int(i) for i=1:100])
Array{Any,1}
这意味着Julia不能将整数密集地打包到数组中,而是将它们表示为指向100个单独“装箱”整数的指针。这些框告诉Julia如何解释它们包含的数据,这需要相当多的开销。这也不仅仅影响数组——任何时候在任何函数中使用
right\u int
的结果时,Julia都无法再优化该函数,并最终进行大量分配。我强烈建议您在和中阅读更多关于类型稳定性的内容

至于使用哪种整数类型:只需使用
Int
,除非你知道你将超过20亿。如果您知道需要支持大量数字,请使用
BigInt
。值得注意的是,创建类似的
BigInt
数组比上面的“大小合适”数组使用的内存要少得多:

julia> @allocated [big(i) for i=1:100]
6496

所以,如果我不知道用户是输入int还是BigInt,我应该将所有内容保存为BigInt?取决于您的用例。他们真的需要超过20亿的数字吗?我的观点是,如果您的Julia程序内存有限,您应该先检查热循环中的类型稳定性,然后再尝试使用
right\u int
之类的方法来保存少量字节。他们输入的数字不太可能超过20亿,但是,我以后需要做的操作可能会超出限制。但无论如何,我明白了,谢谢@MattB。
julia> @allocated [big(i) for i=1:100]
6496