Что лучший способ состоит в том, чтобы не раздавать кадр данных?

Это называется «сопоставление с образцом».

separated(R1, R2) :-
    R1 = rectangle(A1, B1, C1, D1),
    R2 = rectangle(A2, B2, C2, D2),
    /* now just use your As and Bs */

и во многих случаях лучше написать сразу:

separated(rectangle(A1, B1, C1, D1), rectangle(A2, B2, C2, D2)) :-
    /* now just use your As and Bs */
12
задан Cath 14 December 2017 в 00:07
поделиться

2 ответа

Вы, действительно, раздаете объект и используете некоторую память. Но я не думаю, что можно сделать операцию на объекте в R, не раздавая объект. Даже если бы Вы не создали функцию и сделали Ваши операции за пределами функции, то R вел бы себя в основном то же.

Лучший способ видеть это состоит в том, чтобы настроить пример. Если Вы находитесь в Windows, открывают Windows Task Manager. Если Вы находитесь в Linux, открывают окно терминала и выполняют главную команду. Я собираюсь принять Windows в этом примере. В R выполняет следующее:

col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)

rm(col1)
rm(col2)
gc()

это создает несколько векторов, названных col1, и col2 затем комбинирует их в кадр данных, названный myframe. Это затем отбрасывает векторы и вынуждает сборку "мусора" работать. Смотрите в своем диспетчере задач окон при использовании мадам для задачи Rgui.exe. Когда я запускаю R, он использует приблизительно 19 meg мадам. После того, как я выполню вышеупомянутые команды, моя машина использует только под 35 meg для R.

Теперь попробуйте это:

myframe<-myframe+1

Ваше использование памяти для R должно перейти к более чем 144 meg. При принуждении сборки "мусора" с помощью gc (), Вы будете видеть, что он роняет приблизительно к 35 meg. Для попытки этого использования функции можно сделать следующее:

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

при выполнении кода выше использование памяти подпрыгнет к 160 meg или около этого. Рабочий gc () будет ронять его к 35 meg.

Таким образом, что сделать из всего этого? Ну, выполнение операции за пределами функции не состоит в том что намного более эффективно (с точки зрения памяти), чем выполнение его в функции. Сборка "мусора" очищает вещи, реальные хороший. Необходимо ли вынудить gc () работать? Вероятно, не, поскольку это будет работать автоматически по мере необходимости, я просто выполнил его выше, чтобы показать, как это влияет на использование памяти.

Я надеюсь, что это помогает!

10
ответ дан 26 October 2019 в 10:46
поделиться

Я не эксперт R, но большинство языков использует схему подсчета ссылок больших объектов. Копия данных объектов не будет сделана, пока Вы не измените копию объекта. Если Ваши функции только считывают данные (т.е. для анализа) затем, никакая копия не должна быть сделана.

9
ответ дан 26 October 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: