как улучшить время обработки моего кода R - PullRequest
0 голосов
/ 01 апреля 2020

Мне нужно сделать некоторые манипуляции с набором данных, но мой скрипт (показанный ниже) работает очень медленно. Это набор данных , имеющий размерность: 58347 x 41350. Сначала я попытался запустить приведенный ниже сценарий R для гораздо меньшего набора данных (58347 x 5), и мне потребовался час, чтобы его обработать. Я полагаю, что обработка фактического набора данных займет гораздо больше времени. Ребята, знаете ли вы какой-нибудь способ заставить его работать быстрее?

Пожалуйста, смотрите мои коды ниже:

library("LoomExperiment")
dataset<-import("WongAdultRetina homo_sapiens 2019-11-08 16.13.loom")
m<-assay(dataset)
colsums<-colSums(m)
result<-data.frame()
  for(i in seq_len(nrow(m))){
    if(i%%500==0){
      print(paste("i =",i))
    }
    for(j in seq_len(ncol(m))){
      if(colsums[j]== 0){
        result[i,j]<- 0
      }
      else {
        result[i,j]<-(m[i,j]*2000)/colsums[j]
      }
    }
  }
save(result,file="resultlocal.rda")

Большое вам спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Трудно сказать, что делать, не понимая точно, чего вы пытаетесь достичь здесь. Но я попробую.

Сначала вы можете заменить data.frame на data.table. По моему опыту, с ними гораздо быстрее работать.

Во-вторых, вы можете создать result data.frame с указанным размером. Например, похоже, что он всегда будет иметь размер nrow(m) by ncol(m). Итак, result = as.data.frame(matrix(nrow = nrow(m), ncol = ncol(m))). Конечно, вы всегда можете заменить его на data.table тоже. Указание размера data.frame выделит достаточно памяти для объекта. Таким образом, R не нужно будет увеличивать (копировать содержимое оригинального фрейма в объект, который на одну единицу больше, а затем удалить оригинал) объект, чтобы просто добавить другой элемент.

...