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.

Respuestas a la pregunta(2)

Su respuesta a la pregunta