Как получить большую разреженную матрицу в R? (> 2 ^ 31-1)

#r #32bit-64bit #sparse-matrix #rcpp

#r #32bit-64bit #разреженная матрица #rcpp

Вопрос:

Я использую некоторый код на C , чтобы взять текстовый файл из базы данных и создать разреженную матрицу типа dgCMatrix из Matrix пакета. Впервые я пытаюсь построить матрицу, содержащую более 2 ^ 31-1 не разреженных элементов, что означает, что вектор индекса в объекте sparse matrix также должен быть длиннее этого предела. К сожалению, векторы, похоже, используют 32-разрядные целочисленные индексы, как и NumericVectors в Rcpp.

Если не считать написания совершенно нового типа данных с нуля, предоставляет ли R какие-либо средства для этого? Я не думаю, что могу использовать слишком экзотическое решение, поскольку мне нужно glmnet распознать результирующий объект.

Ответ №1:

Пакет spam R sparse matrix algebra с расширением spam64 поддерживает разреженные матрицы с более чем 2 ^ 31-1 ненулевыми элементами.

Простой пример (требуется ~ 50 ГБ памяти и требуется ~ 5 минут для запуска):

 ## -- a regular 32-bit spam matrix
library(spam) # version 2.2-2
s <- spam(1:2^30)
summary(s) 
## Matrix object of class 'spam' of dimension 1073741824x1,
##     with 1073741824 (row-wise) nonzero elements.
##     Density of the matrix is 100%.
## Class 'spam'

## -- a 64-bit spam matrix with 2^31 non-zero entries
library(spam64)
s <- cbind(s, s) 
summary(s) 
## Matrix object of class 'spam' of dimension 1073741824x2,
##     with 2147483648 (row-wise) nonzero elements.
##     Density of the matrix is 100%.
## Class 'spam'

## -- add zeros to make the dimension 2^31 x 2^31
pad(s) <- c(2^31, 2^31) 
summary(s) 
## Matrix object of class 'spam' of dimension 2147483648x2147483648,
##     with 2147483648 (row-wise) nonzero elements.
##     Density of the matrix is 4.66e-08%.
## Class 'spam'
  

Реализация основана на интерфейсе .C64() R для скомпилированного кода, доступного в dotCall64.

Примечание: не все функции spam поддерживают 64-разрядные матрицы (пока).

Некоторые ссылки:

Я один из авторов dotCall64 и spam.

Комментарии:

1. Мало того, что принято раскрывать, что вы являетесь автором рекламируемой библиотеки, обычно вы также не должны отвечать на одно и то же на несколько вопросов. Если вопросы действительно одинаковые, вместо этого требуется повторное голосование. Вы должны, по крайней мере, адаптировать ответ, чтобы ответить на точный конкретный вопрос, на который вы отвечаете

Ответ №2:

В последних версиях R векторы индексируются по R_xlen_t типу, который равен 64 битам на 64-битных платформах и только int на 32-битных платформах.

Rcpp до сих пор все еще используется int везде. Я бы посоветовал вам запросить эту функцию в их списке проблем. Это не сложно, но требует систематического участия кого-то с навыками, временем и желанием. В версии разработки Rcpp11 используется правильный тип, возможно, они могут использовать его в качестве модели.

Однако обратите внимание, что, хотя R использует 64-разрядные целые числа без знака в 64-разрядных форматах, вы фактически ограничены диапазоном, который может обрабатываться double типом, что и даст вам R, если вы запросите значение length вектора. R не имеет 64-битного целочисленного типа, который он может представлять изначально, поэтому, когда вы запрашиваете длину вектора, вы либо получаете int , либо a double в зависимости от значения.

Комментарии:

1. Интересно, спасибо за понимание. Я бы предположил, что R будет за Rcpp!

2. Я был. Сейчас я перенес свой интерес на Rcpp11 по разным причинам.