plumber+future全局对象传递优化... 郭艾伦伤停! 新疆大胜广州结束4连败 阿不都18+10+7齐麟15分... 汪晋贤成武汉三镇重量级新援, 已官宣加盟, 值得球迷期待... 北京五金模具冲压加工厂... 陈赓酒后吐真:我被大材小用了!毛主席大怒:你想把我送给老蒋?...
新闻动态>>你的位置:nba赌注是正规的吗 > 新闻动态 > plumber+future全局对象传递优化

plumber+future全局对象传递优化

发布日期:2025-11-23 10:25    点击次数:198

在单细胞数据分析或其他需要高计算量的R服务化应用中,数据加载与对象传递往往成为性能瓶颈。最近在使用plumber构建接口时,我就遇到了一个典型的性能问题:如何在future并行环境下高效传递大型全局对象。

问题背景

接口核心逻辑如下:

library(future)
library(plumber)
plan(multicore)
integrated <<- readRDS(file = "data/PE_sc_all_combined.v5_seurat.rds")

#* 绘图
#* @serializer unboxedJSON
#* @post /test/FeaturePlot
function() {
  promises::future_promise({
    source("apps/FeaturePlot.R")
    result <- get_images(integrated = integrated, 8, 6)
    list(status = 200, message = "success", data = result)
  }) %>%
    promises::catch(function(e) {
      log_error("Error in /test/FeaturePlot endpoint: {e}")
      list(status = 500, message = conditionMessage(e), data = NULL)
    })
}

这个接口的作用很简单:接收请求后异步调用get_images()函数进行绘图,并返回结果。

但问题出在数据加载部分:integrated是一个大型Seurat对象(几百MB起步),如果每次调用接口都重新加载RDS文件,耗时非常可观。于是我将对象读入为全局变量,避免重复加载。

然而,即使数据已经常驻内存,接口依旧响应缓慢。这让我意识到问题并非在读取,而是在对象传递。

优化思路:plan(multicore)替代plan(multisession)

最初我使用的并行策略是:

plan(multisession)

multisession会为每个任务启动独立的R进程(Windows默认只能用这种方式)。每个子进程都独立运行、独立内存,因此必须进行对象复制。

后来我尝试将其改为:

plan(multicore)

multicore模式下,子进程与主进程共享同一块内存空间(通过操作系统的写时复制机制实现),这意味着:

不再需要对全局对象进行序列化和反序列化;大对象在内存中可直接访问,传递几乎无额外开销;响应速度显著提升。

实测在相同任务下,接口响应时间从数十秒缩短至3秒以内,性能提升非常明显。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。

首页 nba赌注是正规的吗介绍 产品展示 新闻动态

Powered by nba赌注是正规的吗 @2013-2022 RSS地图 HTML地图

Copyright Powered by365建站 © 2013-2024