Большие матрицы в 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. Однако это не так, учитывая мою среду.
Должен ли я использовать собственный тип матрицы для такого типа матрицы?
Ответы
Ответ 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
Конечно, это приводит к некоторым накладным расходам, так как вся строка сначала копируется/открывается, но ее более просто читать.
Также работает для первого извлечения столбца, а затем строки.