Как да освободите памет, която се използва от big.matrix обекти на сривени R сесии

Използвам пакета bigmemory за паралелен достъп до големи матрични обекти , напр. като този

a <- bigmemory::big.matrix(nrow = 200, ncol = 100, shared = TRUE) # shared = TRUE is the default

Работата с получените обекти обаче понякога води до срив на R. Това означава, че паметта, използвана от матричните обекти, не се освобождава. ръководството на bigmemory предупреждава за такъв случай, но не представя решение :

Внезапно затвореният R (използвайки напр. диспечера на задачите) няма да има шанс да финализира обектите big.matrix, което ще доведе до изтичане на памет, тъй като big.matrices ще останат в паметта (може би под объркани имена) без лесен начин за да свържете отново R към тях

След няколко срива и рестартиране на моя R процес, получавам следната грешка:

No space left on device 
Error in CreateSharedMatrix(as.double(nrow),
as.double(ncol), as.character(colnames),  : 
  The shared matrix could not be created

Очевидно паметта ми е блокирана от осиротели големи матрици. Опитах командата ipcs, която се рекламира за изброяване на блокове споделена памет, но размерите на изброените там сегменти са твърде малки в сравнение с моите матрични обекти. Това означава също, че ipcrm не е от полза тук за премахване на моите осиротели обекти.

Къде bigmemory съхранява своите обекти на различни операционни системи и как да изтрия осиротели?


person akraf    schedule 26.04.2019    source източник
comment
Мисля, че обсъждахме подобен проблем в този издание.   -  person F. Privé    schedule 26.04.2019


Отговори (1)


Linux

Обаждане до df -h разреши мистерията за моята операционна система (Linux/CentOS).

$ df -h

Filesystem       Size  Used Avail Use% Mounted on
... 
tmpfs           1008G 1008G     0 100% /dev/shm
...

В папката /dev/shm има временна файлова система. Файловете в него съществуват само в RAM. Тази файлова система се използва за споделяне на данни между процеси. В тази папка имаше няколко файла с произволни низове като имена и множество файлове със същия префикс, които изглежда са свързани с един и същ обект big.matrix:

$ ls -l /dev/shm

-rw-r--r-- 1 user  grp 320000 Apr 26 13:42 gBDEDtvwNegvocUQpYNRMRWP
-rw-r--r-- 1 user  grp      8 Apr 26 13:42 gBDEDtvwNegvocUQpYNRMRWP_counter
-rw-r--r-- 1 user  grp     32 Apr 26 13:42 sem.gBDEDtvwNegvocUQpYNRMRWP_bigmemory_counter_mutex

За съжаление, не знам коя матрица принадлежи на кой файл, но ако нямате работещи R процеси по това време, изтриването на файлове с този модел на име трябва да премахне осиротелите обекти.

Windows

Не знам как другите операционни системи правят това, така че не се колебайте да го добавите в това уики на общността, ако знаете

person Community    schedule 26.04.2019