Julia 中的最大数组长度

Geo*_*ery 5 julia

我可以像这样创建一个包含一百万个元素的数组:

Array(1:1_000_000)
Vector{Int64} with 1000000 elements
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试创建一个包含十亿个元素的数组,我会得到这个:

Array(1:1_000_000_000)
Julia has exited.
Press Enter to start a new session.
Run Code Online (Sandbox Code Playgroud)

Julia 是否无法处理数组中的十亿个元素,或者我在这里做错了什么?

Nil*_*dat 7

您正在创建一个 Array Int64,每个都需要存储在内存中:

julia> sizeof(3)
8
Run Code Online (Sandbox Code Playgroud)

所以在某些时候你肯定会耗尽内存——这不是由于数组中元素数量的一些固有限制,而是整个数组的大小,而这又取决于每个元素的大小. 考虑:

julia> sizeof(Int8(3))
1

julia> [Int8(1) for _ in 1:1_000_000_000]
1000000000-element Array{Int8,1}:
 1
 1
 1
 ?
 1
 1
 1
Run Code Online (Sandbox Code Playgroud)

所以用更小的数据类型(8 位而不是 64 位整数)填充数组允许我创建一个包含更多元素的数组。


Prz*_*fel 7

虽然ArrayJulia 的大小没有限制,但显然有可用的 RAM 内存限制(在另一个答案中提到)。基本上,您可以假设所有可用的系统内存都可以分配给 Julia 进程。sizeof是计算您需要多少 RAM 的好方法。

但是,如果您确实在 Julia 中进行大数组计算,则可以通过多种方式绕过上述限制:

  1. 使用来自主要云计算提供商的大内存机器。我在 AWS Linux 上使用 Julia,它走起来很迷人 - 您可以在虚拟机上拥有高达 4TB RAM 的机器,在裸机机器上拥有 24TB RAM。虽然它不是 Julia 解决方案,但有时它最简单、最便宜的方法。

  2. 有时您的数据是稀疏的——您实际上并没有使用所有这些存储单元。在这种情况下考虑SparseArrays。在其他情况下,您的稀疏数据以某种特定方式格式化(例如,仅对角线上的非零值)在这种情况下使用BanndedMatrices.jl. 值得注意的是,甚至还有一个用于无限代数的 Julia 包。基本上,您在Julia Matrices项目中找到的任何内容都值得一看。

  3. 您可以使用内存映射- 这意味着您的大部分阵列都在磁盘上,只有一部分保存在 RAM 中。通过这种方式,您受到磁盘空间而不是 RAM 的限制。

  4. 您可以使用DistributedArrays.jlArray在多台机器上托管一个巨大的。

希望它对您或其他尝试在 Julia 中进行大数据代数的人有用。