Распараллеливание слияния по row.names двух больших матриц
Я пытаюсь объединить две большие матрицы row.names
в R с merge
, но это занимает довольно много времени. Есть ли возможность распараллелить merge
метод? Может быть, как-то с foreach
библиотека? Или, может быть, есть более быстрые решения, которые делают эту работу?
У меня 8 ядер и 24 ГБ оперативной памяти. Обе матрицы имеют размер около 1,4 Гб и состоят из ~900 строк и ~22000 столбцов.
Вот код для воспроизведения небольшого примера моего набора данных:
df1 <- data.frame(x = 1:3, y = 1:3, row.names = c('r1', 'r2', 'r3'))
df2 <- data.frame(z = 5:7, row.names = c('r1', 'r3', 'r7'))
dfMerged <- merge(df1, df2, by = "row.names", all = TRUE)
dfMerged[is.na(dfMerged)] <- 0
1 ответ
Это же слияние должно быть быстрее в data.table
, Я думаю, что это должно быть выполнимо параллельно, но это может стать более сложным. Вот то же самое слияние в data.table
,
#Create data.table objects
dt1 <- data.table(x = 1:3, y = 1:3, var=c('r1', 'r2', 'r3'))
dt2 <- data.table(z = 5:7, var = c('r1', 'r3', 'r7'))
#Set merge keys
setkey(dt1,var)
setkey(dt2,var)
#Perform full outer join
dtMerged <- merge(dt1,dt2,all=T)
#Replace NAs with zeros (edited for more efficient answer suggest by Arun)
for (j in c("x", "y", "z"))
set(dtMerged, i=which(is.na(dtMerged[[j]])), j=j, value=0L)
dtMerged
var x y z
1: r1 1 1 5
2: r2 2 2 0
3: r3 3 3 6
4: r7 0 0 7