2016-07-21 5 views
1

У меня есть программа, которая загружает большой объект SpatialPolygonsDataFrame (1.4Gb) в память, выполняет некоторый анализ, а затем пытается удалить объект. Однако просмотр системной памяти с использованием системной команды free показывает, что объект остается до тех пор, пока сеанс R не будет сброшен. я могу воспроизвести утечку памяти с помощью rworldmap и rworlxtra пакетов, чтобы сделать большой список карт мира, каждый SpatialPolygonsDataFrame, затем пытается удалить их:Large SpatialPolygonsDataFrame вызывает утечку памяти

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 Вот выход для вызова System2 («бесплатно») после каждого этапа.

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 

Кто-нибудь есть какие-либо идеи, почему это так и каким-либо образом можно было бы удалить один из этих крупных объектов зр без сброса сессии?


R версия 3.2.3 (2015-12-10) Платформа: x86_64-RedHat-Linux-гну (64-разрядная версия) Запуск под: Scientific Linux 7.2 (азота)

ответ

2

Вы надеваете Покажите результат. Я вижу:

> 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 

, которые предполагают, что удаление этих больших карт высвобождает большую часть памяти; значение почти равно значению, полученному в новом сеансе после загрузки пакетов.

 Смежные вопросы

  • Нет связанных вопросов^_^