我可以像这样创建一个包含一百万个元素的数组:
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 是否无法处理数组中的十亿个元素,或者我在这里做错了什么?
您正在创建一个 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 位整数)填充数组允许我创建一个包含更多元素的数组。
虽然ArrayJulia 的大小没有限制,但显然有可用的 RAM 内存限制(在另一个答案中提到)。基本上,您可以假设所有可用的系统内存都可以分配给 Julia 进程。sizeof是计算您需要多少 RAM 的好方法。
但是,如果您确实在 Julia 中进行大数组计算,则可以通过多种方式绕过上述限制:
使用来自主要云计算提供商的大内存机器。我在 AWS Linux 上使用 Julia,它走起来很迷人 - 您可以在虚拟机上拥有高达 4TB RAM 的机器,在裸机机器上拥有 24TB RAM。虽然它不是 Julia 解决方案,但有时它是最简单、最便宜的方法。
有时您的数据是稀疏的——您实际上并没有使用所有这些存储单元。在这种情况下考虑SparseArrays。在其他情况下,您的稀疏数据以某种特定方式格式化(例如,仅对角线上的非零值)在这种情况下使用BanndedMatrices.jl. 值得注意的是,甚至还有一个用于无限代数的 Julia 包。基本上,您在Julia Matrices项目中找到的任何内容都值得一看。
您可以使用内存映射- 这意味着您的大部分阵列都在磁盘上,只有一部分保存在 RAM 中。通过这种方式,您受到磁盘空间而不是 RAM 的限制。
您可以使用DistributedArrays.jl并Array在多台机器上托管一个巨大的。
希望它对您或其他尝试在 Julia 中进行大数据代数的人有用。
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |