2016-07-21 21 views
1

Ich habe ein Programm, lädt ein großes SpatialPolygonsDataFrame Objekt (1,4 GB) in den Speicher führt einige Analysen, dann versucht, das Objekt zu entfernen. Ein Blick auf den Systemspeicher unter Verwendung des Systembefehls free zeigt jedoch, dass das Objekt verbleibt, bis die R-Sitzung zurückgesetzt wird. Ich kann den Speicherverlust reproduziert die rworldmap und rworlxtra Pakete mit einer großen Liste von Weltkarten zu machen, die jeweils ein SpatialPolygonsDataFrame, dann um sie zu entfernen versuchen:Large SpatialPolygonsDataFrame verursacht Speicherverlust

install.packages("sp") 
install.packages("rworldmap") 
install.packages("rworldxtra") 
library(sp) 
library(rworldmap) 
library(rworldxtra) 

these.maps.large <- lapply(1:100, function(x) assign(paste0("a_", x), getMap(resolution = "high"))) 
these.maps.smaller <- lapply(1:20, function(x) assign(paste0("a_", x), getMap(resolution = "high"))) 
# This frees the memory 
rm(list="these.maps.smaller") 
gc(reset=T) 
# This fails to free the memory 
rm(list="these.maps.large") 
gc(reset=T) 

EDIT Hier ist die Ausgabe system2 für den Aufruf ("frei") nach jeder Stufe.

Restarting R session... 

> library(sp) 
> library(rworldmap) 
### Welcome to rworldmap ### 
For a short introduction type :  vignette('rworldmap') 
> library(rworldxtra) 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  1386468 118712292  540008 11888896 129731040 
Swap:  4194300  3505464  688836 
> these.maps.large <- lapply(1:100, function(x) assign(paste0("a_", x), getMap(resolution = "high"))) 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  2708040 117390660  540008 11888956 128409404 
Swap:  4194300  3505464  688836 
> rm(list="these.maps.large") 
> gc(reset=T) 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 585803 31.3 9601876 512.8 585803 31.3 
Vcells 711198 5.5 96623732 737.2 711198 5.5 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  2708428 117390424  540008 11888804 128409168 
Swap:  4194300  3505464  688836 

Restarting R session... 

> library(sp) 
> library(rworldmap) 
### Welcome to rworldmap ### 
For a short introduction type :  vignette('rworldmap') 
> library(rworldxtra) 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  1386696 118711988  540008 11888972 129730744 
Swap:  4194300  3505464  688836 
> these.maps.smaller <- lapply(1:20, function(x) assign(paste0("a_", x), getMap(resolution = "high"))) 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  1699628 118399100  540008 11888928 129417836 
Swap:  4194300  3505464  688836 
> rm(list="these.maps.smaller") 
> gc(reset=T) 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 702817 37.6 2564361 137.0 702817 37.6 
Vcells 966452 7.4 21638748 165.1 966452 7.4 
> system2("free") 
       total  used  free  shared buff/cache available 
Mem:  131987656  1699612 118399116  540008 11888928 129417852 
Swap:  4194300  3505464  688836 

Hat jemand eine Idee, warum dies der Fall ist und eine Möglichkeit, es möglich sein könnte, eine dieser großen sp Objekte zu entfernen, ohne die Sitzung neu einstellen zu müssen?


R Version 3.2.3 (2015.12.10) Plattform: x86_64-RedHat-Linux-Gnu (64-Bit) Lauf unter: Scientific Linux 7.2 (Stickstoff)

Antwort

2

Sie don zeige die Ausgabe nicht an. Ich sehe:

> rm(list="these.maps.smaller") 
> gc(reset=T) 
      used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 7782803 415.7 14442815 771.4 7782803 415.7 
Vcells 113371012 865.0 184235296 1405.7 113371012 865.0 
> # This fails to free the memory 
> rm(list="these.maps.large") 
> gc(reset=T) 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 524121 28 11554252 617.1 524121 28 
Vcells 649283 5 147388236 1124.5 649283 5 

die vorschlagen, dass das Entfernen dieser großen Karten meisten Speicher freigibt; Der Wert ist fast gleich dem in einer neuen Sitzung nach dem Laden der Pakete erhaltenen Wert.