Función eficiente (en cuanto a la memoria) para cálculos repetidos de matrices de distancia Y fragmentación de matrices de distancias extra grandes
Me pregunto si alguien podría ver el siguiente código y el ejemplo mínimo y sugerir mejoras, en particular con respecto a la eficiencia del código cuando se trabaja con conjuntos de datos realmente grandes.
La función toma un data.frame y lo divide por una variable de agrupación (factor) y luego calcula la matriz de distancia para todas las filas en cada grupo.
No necesito mantener las matrices de distancia, solo algunas estadísticas, es decir, la media, el histograma, y luego se pueden descartar.
No sé mucho sobre la asignación de memoria y cosas por el estilo y me pregunto cuál sería la mejor manera de hacerlo, ya que trabajaré con 10.000 - 100.000 casos por grupo. ¡Cualquier pensamiento será apreciado grandemente!
Además, ¿cuál sería la forma menos dolorosa de incluir bigmemory o algún otro paquete de manejo de grandes datos en la función como es en caso de que tenga problemas de memoria graves?
FactorDistances <- function(df) {
# df is the data frame where the first column is the grouping variable.
# find names and number of groups in df (in the example there are three:(2,3,4)
factor.names <- unique(df[1])
n.factors <-length(unique(df$factor))
# split df by factor into list - each subset dataframe is one list element
df.l<-list()
for (f in 1:n.factors) {df.l[[f]]<-df[which(df$factor==factor.names[f,]),]}
# use lapply to go through list and calculate distance matrix for each group
# this results in a new list where each element is a distance matrix
distances <- lapply (df.l, function(x) dist(x[,2:length(x)], method="minkowski", p=2))
# again use lapply to get the mean distance for each group
means <- lapply (distances, mean)
rm(distances)
gc()
return(means)
}
df <- data.frame(cbind(factor=rep(2:4,2:4), rnorm(9), rnorm(9)))
FactorDistances(df)
# The result are three average euclidean distances between all pairs in each group
# If a group has only one member, the value is NaN
Edición: edité el título para reflejar el problema de fragmentación que publiqué como respuesta.