Как я могу отслеживать использование памяти для функции R, которая использует Rcpp?

#r #profiling #rcpp

#r #профилирование #rcpp

Вопрос:

Итак, у меня есть программа, которая импортирует функцию из C с использованием Rcpp, и я хочу измерить ее использование памяти, в частности, ее пиковое использование памяти. Я пробовал Rprof, но, похоже, я не получаю достаточно хорошего разрешения, например, многие мои выходные данные показывают 0 как mem.total в выходных данных, созданных summaryRprof (). Я также пробовал lineprof от Хэдли Уикхема, и его результаты кажутся противоречащими тому, что я получаю от Rprof.

Код с использованием rprof:

 Rprof(NULL)
Rprof(tf <- "rprof.log", memory.profiling=TRUE, interval = .0000025)
xz <- my.function(arg1, arg2)
Rprof(NULL)
out <- summaryRprof(tf, memory = c("both"))
  

Вывод из Rprof:

 $by.self
[1] self.time  self.pct   total.time total.pct  mem.total 
<0 rows> (or 0-length row.names)

$by.total
             total.time total.pct mem.total self.time self.pct
".Call"               0       100         0         0      100
"C   function"        0       100         0         0        0
"R function"          0       100         0         0        0

$sample.interval
[1] 2e-06

$sampling.time
[1] 0.000332
  

С большими интервалами, выход $ by.self возвращается, но по-прежнему показывает ноль для mem.total.

Код с lineprof:

 source("my_function.r")
prof <- lineprof(my.function(arg1, arg2))
shine(prof)
  

Не уверен, как / смогу ли я загружать изображения в stackoverflow, но в основном я получаю блестящий интерфейс приложения, но всего с одной строкой «.Call».

Извините, если это сбивает с толку, пожалуйста, спросите, нужно ли вам, чтобы я что-нибудь прояснил, и спасибо!

Комментарии:

1. Необходимо создать воспроизводимый пример.

2. Пожалуйста, прочтите Написание расширений R и особенно разделы о профилировании памяти . Насколько я помню, для этого может потребоваться R-двоичный инструмент. Это отслеживает все использование памяти R , и поскольку Rcpp использует распределитель памяти R для своих типов (чтобы их можно было вернуть в R), это распространяется и на это. И наоборот, если бы вы использовали типы STL (с их собственным распределителем), они не были бы охвачены.