#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-разрядные матрицы (пока).
Некоторые ссылки:
- https://cran.r-project.org/package=spam
- https://cran.r-project.org/package=spam64
- https://cran.r-project.org/package=dotCall64
- https://doi.org/10.1016/j.cageo.2016.11.015
- https://doi.org/10.1016/j.softx.2018.06.002
Я один из авторов 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 по разным причинам.