Для простой задачи суммирования всех строк в разреженной матрице в R отлично справляется Matrix::rowSums()
:
library(Matrix)
m <- rsparsematrix(10000, 5000, 0.1)
rsums <- Matrix::rowSums(m)
Очевидно, эту функцию можно распараллелить, заблокировав суммирование по строкам. Какие варианты существуют? Кажется, я не могу найти.
Подготовка к бенчмаркингу...
library(rbenchmark)
benchmark(
"Matrix::rowSums" = {
Matrix::rowSums(m)
},
replications = 10,
columns = c("test", "replications", "elapsed", "relative", "user.self", "sys.self"))
# test replications elapsed relative user.self sys.self
# 1 Matrix::rowSums 10 1.14 1 0.95 0.19
Я за самое быстрое решение, R или Rcpp.
Посмотрите это выдающееся исследование Уилла Таунса о переборе разреженных матриц: https://rpubs.com/will_townes/sparse-apply. Вывод, кажется, таков, что Matrix::rowSums
и семья — хорошие исполнители, и распараллеливание может быть достигнуто с помощью slam
и/или data.table
.
Я не понимаю, как можно распараллелить суммирование строк в формате разреженной матрицы, ориентированном на столбцы, или в формате координатной разреженной матрицы, которые являются двумя форматами, в которых Matrix хранит разреженные матрицы. Строки не являются смежными в памяти. Если вы разбиваете набор строк и передаете его потоку, этот поток должен будет прочитать всю матричную структуру данных, чтобы дать вам сумму строк для этого фрагмента. Если вы разделите его на части и запустите 10 потоков, у вас может быть в 10 раз больше вычислительной мощности, но вам придется выполнять в 10 раз больше работы.
Вы можете распараллелить операцию на основе столбцов в разреженной матрице, ориентированной на столбцы. Для вашего конкретного примера с суммой строк я бы просто использовал умножение матриц, чтобы получить суммы строк - Intel MKL очень хорошо распараллеливает умножение матриц. Я не думаю, что для этого есть интерфейс R.
MKL предоставляет BLAS и LAPACK, поэтому он сразу же подключается. См., например. github.com/eddelbuettel/mkl4deb простой в использовании скрипт на Debian и его производных.
"Вилки" даже. SO всегда так же плохо, как и Twitter, разоблачает мое отсутствие правописания. См. fortunes::fortune("Dirk can type")
более раннее заявление по этому поводу.
хорошая мысль, звучит разумно. Предположим, однако, что матрица была транспонирована, а затем был запущен распараллеленный colSums. Вполне возможно, что параллельные столбцы перевесят стоимость транспонирования?