我已经通过包使用一些 python 功能创建了一个函数reticulate
,特别是使用以下命令打开图像PIL
:
image <- "~/Desktop/image.jpg"
pil.image <- reticulate::import( "PIL.Image", convert = FALSE )
img <- pil.image$open( image )
然后我对图像做一些事情(我正在提取几种作物),效果很好。这是我正在做的一个例子(outputs
是我需要的作物数据框,所以crop.grid
只是一个由 4 个数字组成的向量。
crop.grid <- c( outputs$x.start[x],
outputs$y.start[x],
outputs$x.stop[x],
outputs$y.stop[x] )
crop.grid <- as.integer( crop.grid )
crop.grid <- reticulate::r_to_py( crop.grid )
output.array <- img$crop( box = crop.grid )
output.array$save( output.filename )
在此之后,我想从内存中清除图像(我打开的图像非常大,所以要占用大量内存)。我尝试在 python 中关闭图像:
img$close()
以及在 R 中:
rm( img )
gc()
并用我知道非常小的东西替换这个对象。
img <- reticulate::r_to_py( 1L )
所有这些事情都运行良好,但我的 RAM 仍然注册为非常满。我用我创建的每个 python 对象尝试它们,但唯一有效清除 RAM 的方法是重新启动 R 会话。
我知道python
我最好打开图像使用with
以便在过程结束时清除它,但我不确定如何使用reticulate
.
--- 更新类似python
版本:
如果我直接在 python 中执行上述操作:
from PIL import Image
img = Image.open( "/home/user/Desktop/image.jpg" )
output = img.crop( [0,0,100,100] )
然后关闭事物:
output.close()
img.close()
记忆清零。不过,同样的事情在 R 中不起作用。IE:
output.array$close()
img$close()
gc() # for good measure
不清除内存。