Как исправить проблемы с выделением памяти при преобразовании аннотированной модели NLP в dataframe в R

#r #udpipe

#r #udpipe

Вопрос:

Я пытаюсь преобразовать аннотированную модель NLP размером 1,2 ГБ в dataframe. Я использую пакет Udpipe для обработки естественного языка на R со следующим кодом:

 # Additional Topic Models
# annotate and tokenize corpus
model <- udpipe_download_model(language = "english")
udmodel_english <- udpipe_load_model(model$file_model)
s <- udpipe_annotate(udmodel_english, cleaned_text_NLP)
options(java.parameters = "-Xmx32720m")
memory.limit(3210241024*1024)
x <- data.frame(s)
 

Обратите внимание, что у меня 32 ГБ оперативной памяти, и я выделил всю доступную память R для запуска кода. Я также попытался удалить большие объекты, хранящиеся в пространстве среды R, которые не имеют отношения к выполнению приведенного выше кода. R, похоже, не может выделить достаточно памяти для задачи, и результатом стало следующее сообщение об ошибке:

 Error in strsplit(x$conllu, "n") : 
  could not allocate memory (4095 Mb) in C function 'R_AllocStringBuffer' 
 

Мой вопрос двоякий:

  1. Что означает приведенное выше сообщение об ошибке?
  2. Какие обходные пути доступны для решения этой проблемы?

Ответ №1:

Вероятно, у вас есть довольно много документов для аннотирования. Лучше аннотировать фрагментами, как показано на https://cran.r-project.org/web/packages/udpipe/vignettes/udpipe-parallel.html

Следующий код будет аннотировать фрагменты из 50 документов параллельно на 2 ядрах и в основном выполняет вашу команду data.frame. У вас больше не будет проблемы, поскольку функция выполняла strsplit для каждого фрагмента из 50 документов, а не для вашего полного набора данных, где, по-видимому, размер аннотированного текста был слишком большим, чтобы вписаться в пределы stringbuffer в R. Но приведенный ниже код решит вашу проблему.

 x <- udpipe(cleaned_text_NLP, udmodel_english, parallel.cores = 2L, parallel.chunksize = 50)