Подтвердить что ты не робот

Большие матрицы в R: длинные векторы еще не поддерживаются

Я запускаю 64-разрядный R 3.1 в 64-битной среде Ubuntu с 400 ГБ ОЗУ, и я сталкиваюсь с странным ограничением при работе с большими матрицами.

У меня есть числовая матрица A, то есть 4000 строк на 950 000 столбцов. Когда я пытаюсь получить доступ к любому элементу в нем, я получаю следующую ошибку:

Error: long vectors not supported yet: subset.c:733

Хотя моя матрица была прочитана через scan, вы можете реплицировать следующий код

test <- matrix(1,4000,900000) #no error
test[1,1] #error

My Googling показывает, что это было распространенное сообщение об ошибке до R 3.0, где предел равен размеру 2 ^ 31-1. Однако это не так, учитывая мою среду.

Должен ли я использовать собственный тип матрицы для такого типа матрицы?

4b9b3361

Ответ 1

Матрица - это просто атомный вектор с атрибутом измерения, который позволяет R обращаться к нему как к матрице. Ваша матрица представляет собой вектор длины 4000*9000000, который является 3.6e+10 элементами (наибольшее целочисленное значение - приблизительно 2.147e+9). Подстановка длинного вектора поддерживается для атомных векторов (т.е. Доступа к элементам, превышающим предел 2.147e+9). Просто обрабатывайте свою матрицу как длинный вектор.

Если мы помним, что по умолчанию R заполняет матрицы по столбцам, то, если мы хотим получить значение say в test[ 2701 , 850000 ], мы могли бы получить к нему доступ через:

i <- ( 2701 - 1 ) * 850000 + 2701 
test[i]
#[1] 1

Обратите внимание, что это действительно длинное векторное подмножество, потому что:

2701L * 850000L
#[1] NA
#Warning message:
#In 2701L * 850000L : NAs produced by integer overflow

Ответ 2

Альтернативным быстрым решением было бы сначала получить строку, а затем столбец (теперь i-й элемент результирующего вектора) матрицы. Например...

test <- matrix(1,4000,900000) #no error 
test[1,1] #error
test[1, ][1] # no error

Конечно, это приводит к некоторым накладным расходам, так как вся строка сначала копируется/открывается, но ее более просто читать. Также работает для первого извлечения столбца, а затем строки.