将带注释的 NLP 模型转换为 R 中的数据帧时如何解决内存分配问题
How to fix memory allocation issues when converting annotated NLP model to dataframe in R
我正在尝试将大小为 1.2GB 的带注释的 NLP 模型转换为数据帧。我在 R 中使用 Udpipe 包进行自然语言处理,代码如下:
# 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)
请注意,我有 32GB RAM 并将所有可用内存分配给 R 以 运行 代码。我还尝试删除存储在 R 环境 space 中的与上述代码 运行 无关的大对象。 R 似乎无法为任务分配足够的内存,结果出现以下错误消息:
Error in strsplit(x$conllu, "\n") :
could not allocate memory (4095 Mb) in C function 'R_AllocStringBuffer'
我的问题有两个:
- 上面的错误信息是什么意思?
- 有哪些解决方法可以解决此问题?
可能您有很多文档需要注释。最好按块注释,如 https://cran.r-project.org/web/packages/udpipe/vignettes/udpipe-parallel.html
所示
以下代码将跨 2 个内核并行注释 50 个文档块,基本上执行您的 data.frame 命令。您将不再遇到这个问题,因为该函数在 50 个文档的每个块上而不是在您的完整数据集上进行了 strsplit,显然注释文本的大小太大而无法适应 R 中字符串缓冲区的限制。但是下面的代码将解决你的问题。
x <- udpipe(cleaned_text_NLP, udmodel_english, parallel.cores = 2L, parallel.chunksize = 50)
我正在尝试将大小为 1.2GB 的带注释的 NLP 模型转换为数据帧。我在 R 中使用 Udpipe 包进行自然语言处理,代码如下:
# 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)
请注意,我有 32GB RAM 并将所有可用内存分配给 R 以 运行 代码。我还尝试删除存储在 R 环境 space 中的与上述代码 运行 无关的大对象。 R 似乎无法为任务分配足够的内存,结果出现以下错误消息:
Error in strsplit(x$conllu, "\n") :
could not allocate memory (4095 Mb) in C function 'R_AllocStringBuffer'
我的问题有两个:
- 上面的错误信息是什么意思?
- 有哪些解决方法可以解决此问题?
可能您有很多文档需要注释。最好按块注释,如 https://cran.r-project.org/web/packages/udpipe/vignettes/udpipe-parallel.html
所示以下代码将跨 2 个内核并行注释 50 个文档块,基本上执行您的 data.frame 命令。您将不再遇到这个问题,因为该函数在 50 个文档的每个块上而不是在您的完整数据集上进行了 strsplit,显然注释文本的大小太大而无法适应 R 中字符串缓冲区的限制。但是下面的代码将解决你的问题。
x <- udpipe(cleaned_text_NLP, udmodel_english, parallel.cores = 2L, parallel.chunksize = 50)