如何结合furrr实现magick包image_read()的并行处理?
解决magick::image_read()的并行处理问题
问题原因
直接用future_map(多进程模式)调用image_read()会报错“图像指针已失效。无法在R会话之间保存或缓存图像对象”,核心原因是magick生成的图像对象本质是指向底层C库的指针,这类对象无法在独立的R进程(multisession的worker)之间传递。
解决方案
在并行进程中读取图像后,先将其序列化为可跨进程传递的格式(比如raw矢量),传递回主进程后再反序列化为magick图像对象。magick包提供了专门的image_serialize()和image_deserialize()函数来处理这个需求。
代码示例
library(purrr) library(magick) library(furrr) # 待读取的图片链接 links <- c( 'https://images.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png', 'https://th.bing.com/th/id/OIP.v7IDxAcM1Dw7ANwK2-MpBgHaJW?w=123&h=180&c=7&r=0&o=5&pid=1.7' ) # 设置多进程并行计划 plan(multisession, workers = 2) # 并行读取图像并序列化为raw格式 serialized_images <- future_map(links, function(link) { img <- image_read(link) image_serialize(img) }) # 主进程反序列化raw数据为magick图像对象 final_images <- map(serialized_images, image_deserialize) # 查看结果 final_images
补充说明
如果没有使用image_serialize(),也可以通过image_write()将图像转为raw矢量(指定格式),再用image_read()在主进程恢复,但image_serialize()是magick专为跨进程传递设计的方法,效率更高且能保留图像的完整属性。
内容的提问来源于stack exchange,提问作者joshbrows
相关产品推荐
相关产品推荐

