Есть ли способ передачи объектов R в отдельные сеансы R в Linux? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть программа, которая многократно загружает большие наборы данных, которые хранятся в формате R Rds.Вот глупый пример, который имеет все характерные особенности:

# make and save the data
big_data <- matrix(rnorm(1e6^2), 1e6)
saveRDS(big_data, file = "big_data.Rds")

# write a program that uses the data
big_data <- readRDS("big_data.Rds")
BIGGER_data <- big_data+rnorm(1)
print("hooray!")
# save this in a text file called `my_program.R`

# run this program a bunch
for (i = 1:1000){
    system("Rscript my_program.R")
}

Узкое место - загрузка данных.Но что, если у меня где-то был отдельный процесс, который содержал данные в памяти?

Может быть, что-то вроде этого:

# write a program to hold the data in memory
big_data <- readRDS("big_data.Rds")
# save this as `holder.R`  open a terminal and do
Rscript holder.R

Теперь есть процесс, выполняющийся где-то с моими данными в памяти.Как я могу получить его из другого сеанса R?(Я предполагаю, что это будет быстрее, чем загрузка, но верно ли это?)

Может быть, что-то вроде этого:

# write another program:
big_data <- get_big_data_from_holder()
BIGGER_data <- big_data+1
print("yahoo!")
# save this as `my_improved_program.R`

# now do the following:
for (i = 1:1000){
    system("Rscript my_improved_program.R")
}

Так что я думаю, что мой вопрос как бы выглядела функция get_big_data_from_holder() ?Можно ли сделать это?Практическая?

Предыстория: я пытаюсь обойти то, что выглядит как утечка памяти в интерфейсе R к keras / tenorflow, которую я описал здесь .Обходной путь - позволить ОС очистить весь мусор, оставшийся после сеанса TF, чтобы я мог запускать сеансы TF один за другим без замедления компьютера до ползания.

Редактировать: возможно, я мог бы сделатьэто с clone() системным вызовом?Концептуально я могу представить, что я бы клонировал процесс, выполняющий holder, а затем выполнил бы все команды в программе, которые зависят от загруженных данных.Но я не знаю, как это будет сделано.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

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

saveRDS(..., compress = FALSE)
0 голосов
/ 20 сентября 2018

Мой пакет filematrix может оказаться полезным для хранения и быстрого доступа к большой матрице.

Чтобы создать его, запустите:

big_data = matrix(rnorm(1e4^2), 1e4)

library(filematrix)
fm = fm.create.from.matrix('matrix_file', big_data)
close(fm)

Чтобы получить доступ к нему из другого сеанса R:

library(filematrix)
fm = fm.open('matrix_file')
show(fm[1:3,1:3])
close(fm)
...