Поддержка больших разреженных матриц R

Есть ли поддержка больших разреженных матриц в R? В настоящее время я имею дело с 1,9-мегапиксельной разреженной квадратной матрицей с плотностью около 0.001.

Я хотел провести стресс-тестирование создания этой матрицы в R на моем спотовом экземпляре AWS с памятью 480 ГБ.

library(Matrix)

DIMS = as.numeric(1988463)
DENSITY = as.numeric(0.001)
VALS = as.numeric(DIMS*DIMS*DENSITY)

i <- sample(DIMS, VALS, replace = TRUE)    
j <- sample(DIMS, VALS, replace = TRUE)    
x <- rpois(VALS, 10)

sp_matrix <- sparseMatrix(i = i, 
                          j = j, 
                          x = as.numeric(x), 
                          dims=list(DIMS, DIMS))

Однако я получаю эту ошибку.

Error in validityMethod(as(object, superClass)): long vectors not supported yet: ../../src/include/Rinlinedfuns.h:522
Traceback:

1. system.time(sp_matrix <- sparseMatrix(i = i, j = j, x = as.numeric(x), 
 .     dims = list(DIMS, DIMS)))
2. sparseMatrix(i = i, j = j, x = as.numeric(x), dims = list(DIMS, 
 .     DIMS))
3. validObject(r)
4. anyStrings(validityMethod(as(object, superClass)))
5. isTRUE(x)
6. validityMethod(as(object, superClass))
Timing stopped at: 76.42 73.41 151

Есть ли какой-нибудь пакет или обходной путь для этой проблемы? В конце концов, я буду использовать пакет reticulate для загрузки разреженной матрицы csr из numpy, чтобы воспользоваться преимуществами более быстрого и экономичного пакета text2vec для запуска перчаток, который требует, чтобы данные были в формате dgCMatrix.

Изменить

Я также пробовал spam со следующими строками кода для имитации большой и разреженной матрицы.

library(spam)
test_matrix <- spam_random(nrow = 1900000, ncol = 1900000, density = 0.001)

Он будет работать со следующим предупреждением:

Warning message in spam_random(nrow = 1900000, ncol = 1900000, density = 0.001):
"integer overflow in 'cumsum'; use 'cumsum(as.numeric(.))'"

Пока он в конечном итоге не истечет со следующим сообщением об ошибке:

Error in if (rowp[i] == rowp[i + 1L]) next: missing value where TRUE/FALSE needed
Traceback:

1. system.time(test_matrix <- spam_random(nrow = 1900000, ncol = 1900000, 
 .     density = 0.001))
2. spam_random(nrow = 1900000, ncol = 1900000, density = 0.001)
Timing stopped at: 1657 228.3 1903

person Olivier    schedule 07.05.2020    source источник
comment
он все еще слишком велик для R. Вы можете проверить этот пост stackoverflow.com/questions/54405435/, я не знаю, работает ли пакет до сих пор   -  person StupidWolf    schedule 07.05.2020
comment
Так нет ли обходного пути, который мог бы сработать? Я знаю, что R 3.x может обрабатывать гораздо более длинные векторы, чем 2^31. Я пробовал spam безуспешно (см. редактирование выше).   -  person Olivier    schedule 07.05.2020
comment
Перчатка @Olivier text2vec принимает dgTMatrix в качестве входных данных. Так что на самом деле нужно i, j, x триплетов. Вы можете попробовать построить триплетную матрицу с помощью sp_matrix <- sparseMatrix(i = i, j = j, x = as.numeric(x), dims=list(DIMS, DIMS), giveCsparse = F, check = F). Не уверен, что это сработает.   -  person Dmitriy Selivanov    schedule 07.05.2020
comment
@DmitriySelivanov К сожалению, это не удалось. Error in validityMethod(as(object, superClass)) : long vectors not supported yet: ../../src/include/Rinlinedfuns.h:522 Calls: <Anonymous> ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous> Execution halted Могу ли я предположить, что R просто не может обрабатывать разреженные матрицы такого размера?   -  person Olivier    schedule 07.05.2020
comment
Точно не знаю, но вроде да.   -  person Dmitriy Selivanov    schedule 07.05.2020
comment
Чтобы внести ясность в spam, вам нужно использовать spam64, если вы хотите использовать индексы int64 для своей матрицы.   -  person CJR    schedule 10.05.2020