R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Kovalevyn tilankäytön analysointi

Tulipa vastaan tilanne, jossa piti selvitellä, mitkä kymmenistä kansioista ja niiden alakansioista vievät eniten tilaa tietokoneen kovalevyllä. Käytössä oleva Windows 7 -ympäristö oli kuitenkin rajattu, eikä uusia apuohjelmia voinut siis asentaa. Microsoftin sivuilta löytyy kyllä PowerShell -versio levyanalysaattorista, mutta päätin kuitenkin toteuttaa vastaavan toiminnallisuuden R:llä. Mainittakoon, että toimiva, mutta hidas siitä tuli kilpailijoihin verrattuna.

Funktio on seuraava:

rdisc<-function(path=NULL, use.hierarchy=FALSE, cut.level=3, plot=TRUE) {
 
   # Onko tarvittavat paketit asennettu?
   req.pkgs<-c("pathological", "treemap")
   tbi<-req.pkgs[!req.pkgs %in% rownames(installed.packages())]
 
   if(length(tbi>0)) {
      setInternet2()
      install.packages(tbi)
   }
 
   # Ladataan tarvittavat paketit
   require("pathological")
   require("treemap")
 
   # Tiedostojen polut
   if(is.null(path)) {
      stop("Määrittele argumentilla path jokin tutkittava polku!")
   } else {
      files<-dir(path, full.names=T, recursive=T, include.dirs=T, no..=T)
   }
 
   # Muodostetaan kullekin tiedostolle yksi tulosrivi
   res<-data.frame(matrix(ncol=6, nrow=length(files), data=NA))
   colnames(res)<-c("path", "dirname", "basename", "size.bytes", "last_access", "parent")
   res[,1]<-files
   res[,2]<-dirname(files)
   res[,3]<-basename(files)
   infos<-do.call(file.info, list(files))
   res[,4]<-infos$size
   res[,5]<-infos$atime
   res[,6]<-res[,2]
 
   # Päätellään polkujen hierarkkia
   if(use.hierarchy) {
      a<-split_path(res$path)
      rowMax <- max(sapply(a, length)) 
      p<-do.call(rbind, lapply(a, function(x){ 
         length(x) <- rowMax 
         x 
      })) 
      nas<-which(!is.na(p), arr.ind=TRUE)
      nasmax<-aggregate(nas[,2], list(nas[,1]), max)
      if(cut.level>ncol(p)) {
         cut.level<-ncol(p)
      }
      res$parent<-as.vector(apply(p[,1:cut.level], 1, function(x) paste(na.omit(x), collapse="/")))
      res$extension<-get_extension(res$path)
   }
 
   # Piirretään kuva
   if(plot) {
      tmap<-treemap(res, index=c("parent", "basename"), vSize="size.bytes", border.col=c("white", "grey75"))
   }
 
   # Palautetaan tulostiedosto
   ares<-aggregate(res$size.bytes, list(res$parent), sum)
   if(use.hierarchy) {
      final<-list(info=res, parent.size=ares, hierarchy=p)
   } else {
      final<-list(info=res, parent.size=ares)
   }      
   return(final)
 
}

Funktiota voi kutsua yksinkertaisesti antamalla sille vain analysoitavan polun. Lisäksi on mahdollista määritellä huomioidaanko kansioiden hierarkkinen rakenne, ja jos huomioidaan, niin miltä tasolta polut katkaistaan kansioiden kokojen laskemiseksi. Oletusarvoisesti käytetään koko hierarkkiaa, ja kansioiden koot lasketaan alimmalle alikansiotasolle. Seuraavilla kahdella rivillä saa lisäksi vähän lisäinfoa:

# Analysoidaan R:n asennushakemisto
X11(); tmap2<-rdisc("C:\\Program Files\\R\\R-3.1.0\\")
 
# Lasketaan suurimpien kansioiden koot
suuret2<-tmap2$parent.size; suuret2<-suuret2[order(suuret2$x),]; suuret2$cumsum<-cumsum(suuret2$x); suuret2
 
tail(suuret2)
                                                                      Group.1        x     cumsum
4812                   C:/Program Files/R/R-3.1.0//library/XLConnectJars/java 17572488  909809481
3544 C:/Program Files/R/R-3.1.0//library/RGtk2/gtk/x64/share/gtk-doc/html/gtk 18843308  928652789
3469                    C:/Program Files/R/R-3.1.0//library/RGtk2/gtk/x64/bin 19179969  947832758
4333                      C:/Program Files/R/R-3.1.0//library/speedRlibs/java 21643129  969475887
2742                      C:/Program Files/R/R-3.1.0//library/pasilla/extdata 23632436  993108323
4434                         C:/Program Files/R/R-3.1.0//library/stringi/libs 25908416 1019016739

Syntyneessä tulosteessa on kansion polku (Group.1), kansion koko (x) ja kansio huomioiden kumulatiivinen koko (cumsum). R-asennukseni näyttää olevan n. 1 Gt:n kokoinen.

Lisäksi edellä mainittu funktio tekee kuvan, jossa levytilan käyttö on esitetty puukaaviona: