Выгрузить скомпилированный код пакета R, чтобы избежать утечек памяти?

У меня есть большая программа на C (я не могу поделиться воспроизводимым кодом), которую я хотел бы включить в пакет R, чтобы пользователям не приходилось самим компилировать ее и она была автономной. Таким образом, часть скомпилированного кода используется только одной функцией пакета, что-то вроде

wrapperfoo <- function(config_file_path, output_file_path) {
  #stuff
  #...
  .C("myprogram", config_file_path, output_file_path)
  #... 
}

Проблема с кодом C в том, что он использует сканер Flex/Bison, который не сбрасывается. Код не мой, и я хочу избежать переписывания сканера (и простые исправления в C не сработали, включая некоторые темы о SO, например: yylex_destroy()Я новичок в C, поэтому отладка сложна).

Это нормально, если в R I выгрузить пакет после вызова моей программы и загрузить его снова. (И он отлично работает, если скомпилирован и запускается за пределами R.)

Так что это работает:

library(mypackage)
wrapperfunction()
unloadNamespace("mypackage") #invokes library.dynam.unload()
library(mypackage)
wrapperfunction()

Но это не будет

library(mypackage)
wrapperfunction()
wrapperfunction() #parser crashes and with it R

Это нормально, чтобы загрузить и выгрузить DLL в моем wrapperfunction()? Сдается мне, что это против хорошей практики написания пакетов R, и я даже не знаю, возможно ли это? Или есть другая функция, которая будет очищать после.C? Будет ли использование.Call помочь? gc() не помогает

0 ответов

Другие вопросы по тегам