Максимальная длина массива в Юлии - PullRequest
5 голосов
/ 12 апреля 2020

Я могу создать массив из миллионов элементов, например:

Array(1:1_000_000)
Vector{Int64} with 1000000 elements

, но если я попытаюсь создать массив из миллиардов элементов, я получу this:

Array(1:1_000_000_000)
Julia has exited.
Press Enter to start a new session.

Неужели Джулия не в состоянии обработать миллиард элементов в массиве или что я здесь не так делаю?

Ответы [ 2 ]

7 голосов
/ 12 апреля 2020

Хотя нет предела, насколько большим может быть Array в Джулии, очевидно, есть предел доступной памяти RAM (упомянутый в другом ответе). По сути, вы можете предположить, что вся доступная системная память может быть выделена для процесса Julia. sizeof - это хороший способ подсчитать, сколько оперативной памяти вам нужно.

Однако, если вы действительно выполняете вычисления с большими массивами в Julia, вышеуказанный предел можно обойти многими способами:

  1. Использование больших машин памяти от крупного поставщика облачных вычислений. Я использую Джулию на AWS Linux, и это выглядит как очарование - у вас может быть машина до 4 ТБ ОЗУ на виртуальной машине и 24 ТБ ОЗУ на голой металлической машине. Хотя это не решение Julia, иногда оно является самым простым и дешевым способом go.

  2. Иногда ваши данные редки - вы на самом деле не используете все эти ячейки памяти. В таких случаях рассмотрим SparseArrays. В других случаях ваши разреженные данные форматируются определенным c способом (например, ненулевые значения только по диагонали), в этом случае используйте BanndedMatrices.jl. Стоит отметить, что существует даже пакет Julia для бесконечной алгебры . В общем, все, что вы найдете в проекте Julia Matrices , стоит посмотреть.

  3. Вы можете использовать отображение памяти - это означает, что большинство ваших массив находится на диске, и только некоторая часть находится в оперативной памяти. Таким образом, вы ограничены дисковым пространством, а не оперативной памятью.

  4. Вы можете использовать DistributedArrays.jl и иметь один огромный Array, размещенный на нескольких машины.

Надеюсь, это будет полезно для вас или других людей, пытающихся сделать алгебру больших данных в Юлии.

7 голосов
/ 12 апреля 2020

Вы создаете массив из Int64, каждый из которых должен храниться в памяти:

julia> sizeof(3)
8

Так что в какой-то момент вам обязательно не хватит памяти - это не связано с к некоторому внутреннему ограничению на количество элементов в массиве, а точнее к размеру всего массива, который, в свою очередь, зависит от размера каждого элемента. Обратите внимание:

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

, поэтому заполнение массива меньшим типом данных (8-битное, а не 64-битное целое число) позволяет мне создать массив с большим количеством элементов.

...