优化运行时间:改变igraph中边的权重需要很长时间。有没有办法优化它?

2023-12-20

我正在从 osmar 对象构建的 igraph 中搜索一组边,并希望更改这些边的权重。 由于我的图表很大,因此这项任务需要很长时间。 由于我在循环中运行此函数,因此运行时间变得更大。

有什么办法可以优化这个吗?

这是代码:

library(osmar)
library(igraph)
library(tidyr)
library(dplyr)

### Get data ----
src <- osmsource_api(url = "https://api.openstreetmap.org/api/0.6/")
muc_bbox <- center_bbox(11.575278, 48.137222, 1000, 1000)
muc <- get_osm(muc_bbox, src)

### Reduce to highways: ----
hways <- subset(muc, way_ids = find(muc, way(tags(k == "highway"))))
hways <- find(hways, way(tags(k == "name")))
hways <- find_down(muc, way(hways))
hways <- subset(muc, ids = hways)

#### Plot data ----
## Plot complete data and highways on top:
plot(muc)
plot_ways(muc, col = "lightgrey")
plot_ways(hways, col = "coral", add = TRUE)

### Define route start and end nodes: ----
id<-find(muc, node(tags(v %agrep% "Sendlinger Tor")))[1]
hway_start_node <-find_nearest_node(muc, id, way(tags(k == "highway"))) 
hway_start <- subset(muc, node(hway_start_node))

id <- find(muc, node(attrs(lon > 11.58 & lat > 48.15)))[1]
hway_end_node <- find_nearest_node(muc, id, way(tags(k == "highway")))
hway_end <- subset(muc, node(hway_end_node))

## Add the route start and and nodes to the plot:
plot_nodes(hway_start, add = TRUE, col = "red", pch = 19, cex = 2)
plot_nodes(hway_end, add = TRUE, col = "red", pch = 19, cex = 2)

### Create street graph ----
gr <- as.undirected(as_igraph(hways))

### Compute shortest route: ----
# Calculate route
route <- function(start_node,end_node) {
  get.shortest.paths(gr,
                     from = as.character(start_node),
                     to = as.character(end_node), 
                     mode = "all")[[1]][[1]]}
# Plot route
plot.route <- function(r,color) {
  r.nodes.names <- as.numeric(V(gr)[r]$name)
  r.ways <- subset(hways, ids = osmar::find_up(hways, node(r.nodes.names)))
  plot_ways(r.ways, add = TRUE, col = color, lwd = 2)
}
nways <-  1
numway <- 1
r <- route(hway_start_node,hway_end_node)

# Plot route

color <- colorRampPalette(c("springgreen","royalblue"))(nways)[numway]
plot.route(r,color)


## Route details ----
# Construct a new osmar object containing only elements 
# related to the nodes defining the route:
route_nodes <- as.numeric(V(gr)[r]$name)
route_ids <- find_up(hways, node(route_nodes))

osmar.route <- subset(hways, ids = route_ids)
osmar.nodes.ids <- osmar.route$nodes$attrs$id

# Extract the nodes’ coordinates,
osmar.nodes.coords <- osmar.route$nodes$attrs[, c("lon", "lat")]
osmar.nodes <- cbind(data.frame(ids = osmar.nodes.ids),
                     data.frame(ids_igraph = as.numeric(V(gr)[r]) ),
                     osmar.nodes.coords) 


## Find edges ids containing points of interest ----
wished.coords <- data.frame(wlon = c(11.57631),
                            wlat = c(48.14016)) 


# Calculate all distances
distances <- crossing(osmar.nodes,wished.coords) %>%
             mutate(dist = geosphere::distHaversine(cbind(lon,lat),cbind(wlon,wlat)))


# Select nodes below maximum distance :
mindist <- 50 #m

wished.nodes <- distances %>% filter(dist < mindist)

# Select edges incident to these nodes :
selected.edges <- unlist(incident_edges(gr,V(gr)[wished.nodes$ids_igraph]))

This is where the slowdown occurs: Weight of selected edges, change it by multiplying it with 10
E(gr)[selected.edges]$weight<-E(gr)[selected.edges]$weight*10

这就是减速发生的地方:所选边的权重,通过乘以 10 来更改它

E(gr)[selected.edges]$weight<-E(gr)[selected.edges]$weight*10

也许我可以使用哈希图?

UPDATE

hashmap

单位:秒

Hashmap:

expr           min       lq     mean   median      uq      max     neval 

Hashmap      3.248543 3.289474 3.472038 3.324417 3.734050 4.188924   100 

Without      3.267549 3.333012 3.557179 3.367015 3.776429 5.643784   100

Sadly it does not seemt to bring a lot of improvement.


library(hashmap) 
#https://github.com/nathan-russell/hashmap
         H <- hashmap(E(gr)[selected.edges],E(gr)[selected.edges]$weight)
         sapply(H$find(E(grr)[selected.edges]), function(x) x * 10)

UPDATE:根据 igraph 文档,igraph 是线程安全的,所以我可以使用并行。

我目前正在尝试这个:

no_cores <- detectCores(logical = FALSE) 
 data <- split(selected.edges,factor(sort(rank(selected.edges)%%no_cores)))
 c_result <- mclapply(1:no_cores, function(x) {
 E(gr)[unlist(data[[x]])]$weight * 1000 / mean_value }, mc.cores = no_cores) 
   
     E(gr)[unlist(data)]$weight<-unlist(c_result)

我想知道为什么我必须在并行循环之外执行“写入步骤”。 当我试图在循环内将权重写回 igraph 时,它不起作用,即权重没有更新。

先感谢您! BR


如所示高级R http://adv-r.had.co.nz/Performance.html,R 中的实现性能可能因语法而有很大差异。

E(gr)[selected.edges]$weight<-E(gr)[selected.edges]$weight*10

是一个有效的语法,但也可以用其他方式表述:

set.edge.attribute(graph=gr,name="weight",index=selected.edges,value=10*get.edge.attribute(graph=gr,name="weight",index=selected.edges))

那么让我们比较一下这两种解决方案:

microbenchmark::microbenchmark(
  ref={E(gr)[selected.edges]$weight<-E(gr)[selected.edges]$weight*10},
  new={set.edge.attribute(graph=gr,name="weight",index=selected.edges,value=10*get.edge.attribute(graph=gr,name="weight",index=selected.edges))})

Unit: microseconds
 expr       min        lq       mean    median        uq       max neval cld
  ref 15920.404 16567.788 17793.4412 17111.583 18491.685 25867.477   100   b
  new   246.974   266.462   296.5088   278.769   292.718   662.974   100  a 

@Andreas,如果这可以解决您的问题,您可以检查更大的数据集吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化运行时间:改变igraph中边的权重需要很长时间。有没有办法优化它? 的相关文章

  • 如何让 print() 将参数传递给 R 中用户定义的打印方法?

    我在 R 中定义了一个 S3 类 它需要自己的打印方法 当我创建这些对象的列表并打印它时 R 按其应有的方式对列表中的每个元素使用我的打印方法 我想对打印方法实际显示的数量进行一些控制 因此 我的类的 print 方法需要一些额外的参数 但
  • 如何获得 STAN 中最大似然估计的标准误差?

    我在 Stan 中使用最大似然优化 但不幸的是optimizing 函数不报告标准错误 gt MLb4c lt optimizing get stanmodel fitb4c data win data init inits STAN OP
  • 替换列表列表中的元素

    The applyR 中的函数是简化 for 循环以获得输出的好方法 是否有一个等效的函数可以帮助人们在替换向量的值时避免 for 循环 通过示例可以更好地理解这一点 Take this list for example x list li
  • R::bigmemory - 如何创建角色big.matrix?

    我尝试使用bigmemory封装在R我一开始就陷入困境 我愿意 temp lt matrix paste a 1 10 5 2 并得到一个字符矩阵 没关系 但后来我尝试 x lt as big matrix temp type char 我
  • R 中具有稳健回归的异常值

    我正在使用lmrobR 中的函数使用robustbase用于稳健回归的库 我会把它用作 rob reg lt lmrob y 0 dat method MM control a1 当我想返回我使用的摘要时summary rob reg 稳健
  • 如何在 ggplot 中保持配色方案,同时删除每个图中未使用的级别?

    我想比较一个图中的数据的一些子组和另一图中的一些其他子组 如果我绘制一个图 其中绘制了所有子组 那么这个数字将是巨大的 并且每个单独的比较都会变得困难 我认为如果给定的子组在所有图中都具有相同的颜色 这对读者来说会更有意义 这是我尝试过的两
  • numpy.histogram 的 hist 维度,密度 = True

    假设我有这个数组 A array 0 0019879 0 00172861 0 00527226 0 00639585 0 00242005 0 00717373 0 00371651 0 00164218 0 00034572 0 008
  • kableExtra 中的 row_spec() 函数不会在 html 输出中创建水平线

    我想在 kableextra 表中的某一行下方添加一条水平线 row spec 函数的参数 hline after 应该在行下方添加水平线 row spec 文档 https www rdocumentation org packages
  • 如何在for循环中引用变量?

    我正在循环访问不同的 data tables 和 data table 中的变量 但我在引用内部变量时遇到问题for loop dt1 lt data table a1 c 1 2 3 a2 c 4 5 2 dt2 lt data tabl
  • 如何从 Fortran 调用 R 函数?

    根据http gallery rcpp org articles r function from c http gallery rcpp org articles r function from c Rcpp 允许用户从 C 调用 R 函数
  • 我无法下载 R 中的 reshape2 包 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试安装 R 包时收到此响应 gt installed packages reshape2 Package LibPath V
  • R - Plm 和 lm - 固定效应

    我有一个平衡面板数据集 df 本质上由三个变量组成 A B and Y 对于一堆独特识别的区域来说 它会随着时间的推移而变化 我想运行一个回归 其中包括区域 下面等式中的区域 和时间 年份 固定效应 如果我没记错的话 我可以通过不同的方式来
  • 通过间接引用列来修改数据框中的某些值

    我正在整理一些数据 我们将失败的数据分类到垃圾箱中 并按批次计算每个分类箱的有限产量 我有一个描述排序箱的元表 这些行按升序测试顺序排列 一些排序标签带有非语法名称 sort tbl lt tibble tribble weight lab
  • 绘制点之间的所有线

    我有以下 R 代码 x lt c 0 01848598 0 08052353 0 06741172 0 11652034 y lt c 0 4177541 0 4042247 0 3964025 0 4074685 d lt data fr
  • API 请求和curl::curl_fetch_memory(url, handle = handle) 中的错误:SSL 证书问题:证书已过期

    几天前 我运行了代码几个月 没有任何问题 GET url myurl query 今天我遇到一个错误 Error in curl curl fetch memory url handle handle SSL certificate pro
  • 在 R 中创建虚拟变量,排除某些情况为 NA

    我的数据看起来像这样 V1 V2 A 0 B 1 C 2 D 3 E 4 F 5 G 9 我想创建一个虚拟变量R where 0 1 1 2 3 4 and NA 0 5 9 应该很简单 有人可以帮忙吗 我们可以转换V2 into a fa
  • 使用 R 选择第一个非 NA 值

    df lt data frame ID c 1 1 1 2 3 3 3 test c NA 5 5 6 4 NA 7 3 NA 10 9 我想创建一个名为 value 的变量 它是每个单独 ID 测试的第一个非 NA 值 对于只有NA的个体
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • 使用 Shiny 发布平行坐标图表时出现“错误:路径[1]="”:没有这样的文件或目录”

    我有一个似乎很常见但我还没有找到解决方案的问题 当尝试使用 rCharts Parcoords 发布 Web 应用程序时 出现以下错误 错误 路径 1 没有这样的文件或目录 奇怪的是 该应用程序在我的笔记本电脑上运行得很好 下面是我正在使用

随机推荐

  • 代表自由团体的好方法是什么?

    很容易表示自由岩浆 二叉叶树 自由半群 非空列表 和自由幺半群 列表 并且不难证明它们实际上就是它们所声称的那样 但自由团体似乎要棘手得多 似乎至少有两种方法可以使用通常的方法List Either a 表示 将要求编码为类型 如果您有Le
  • Krajee Bootstrap 文件输入,捕获 AJAX 成功响应

    我正在使用 Krajee Bootstrap 文件输入插件通过 AJAX 调用执行上传 以下是 Krajee 插件 AJAX 部分的链接 Krajee 插件 AJAX http plugins krajee com file input d
  • 使用 Hilt 将存储库注入 Android 中的服务

    我有一个带有 Hilt 依赖注入的 Android 项目 我已经定义了MyApplication and MyModule如下 HiltAndroidApp class MyApplication Application Module In
  • 使用 Javascript 打开 vCard

    使用二维码电子名片 用户用手机扫描该代码 然后手机上会弹出 添加到联系人 对话框 例如下面的代码 我怎样才能做到同样的事情 但我希望它通过单击按钮来完成相同的操作 而不是扫描二维码 我已经尝试过以下方法 var btn document g
  • 如何在 Alpine Docker 镜像上安装 gdbserver 包?

    我一直在尝试在 Alpine Docker 映像上安装 gdbserver 包 https hub docker com alpine https hub docker com alpine apk添加gdbserver 给了我这个 错误
  • Kotlin 如何创建动态对象

    在 javascript 中我们可以做这样的事情 function putritanjungsari data console log data name let data name putri div m4th putritanjungs
  • 选择不具有特定类的元素的最后一个子元素

    我尝试选择没有特定类别的子元素的最后一个元素 我已经设置了一个js fiddle http jsfiddle net VATaj 2
  • 在 Woocommerce 3 中通过 ajax 提交并创建结帐订单

    我在结账表单中添加了一个按钮
  • 为什么引入新的 JSLint 错误“使用空格,而不是制表符”和“不安全字符”?

    我使用 JSLint 验证 JavaScript 已经有大约 2 年了 偶尔会有一些规则发生变化 一般来说 当 JSLint 引入新规则时 会有一个复选框可以在解析时忽略此规则 或者如果您选择不忽略它 则使您的代码符合它 然而 当我今天运行
  • android LiveData 或协程通道

    让应用程序使用 LiveData 和 ViewModel for UI 来观察存储库中的数据更新 它运行良好 现在有人提出 LiveData还没有被很好地采用 也许应该改用协程的通道 首先不确定关于LiveData的说法是否准确 我确信使用
  • Python远程过程调用(不带远程部分)

    我有一个不以 root 身份运行的 Python 服务器 它面向我正在开发的应用程序 然而 有一些应用程序功能需要访问 RAW 套接字 这意味着 root 权限 显然 我不想以 root 身份运行主服务器 因此我的解决方案是创建一个守护进程
  • SQL Server + 实体框架基础知识

    我的任务是用 C 创建一个程序来管理公司的员工 仅简要概述 每个员工的所有信息都存储在 MS SQL 数据库中 作为表示层 我必须使用 WPF 并作为与数据库的通信 LINQ to Entities 问题是 我设法自学了 WPF 但 SQL
  • 制作一个 24/7 运行并从命名管道读取的 Perl 守护进程

    我正在尝试使用 perl 制作一个日志分析器 分析器将在 AIX 服务器上的后台全天候 24 7 运行 并从系统日志将日志定向到的管道 从整个网络 读取 基本上 logs from network gt named pipe A gt pe
  • TDD:您为单元测试公开了哪些方法?

    TDD 有一个方面我从未完全理解 假设有人要求您实现一个简单的 Stack 对象 如果您的设计正确 您将得到一个非常最小且干净的 API 认为 push pop and isEmpty 除此之外 任何事情都会过度抑制需求 并让用户有太多的空
  • 导出和导入 IndexedDB 数据

    我正在制作一个供我自己使用的工具 需要一个简单的数据库 这似乎是学习 HTML5 IndexedDB API 的好机会 但重要的是我在任何时候都不会丢失数据 我想备份浏览器的配置文件目录就可以进行备份 但我也希望可能使用不同的计算机 因此导
  • 从github导入ADT Eclipse中的android项目

    我正在尝试将 android 项目从 github 导入到 ADT Eclipse 中 但当我克隆它时 它在存储库中找不到任何项目 该仓库显然是一个android应用程序项目 从源代码来看 但没有找到可以导入的项目 我的步骤如下 在 包资源
  • 在函数重载中将右值引用实现为参数

    我已经询问过有关代码审查和软件工程的问题 但该主题不适合该网站 因此我在这里询问希望这不是基于意见的 我是一名 老派 C 开发人员 我已经停留在 C 2003 但现在我已经阅读了一些有关现代 C 11 17 的书籍 并且正在重写我的一些库
  • Python3.10源码venv已经改变

    我在个人仓库上做了一些 python leetcode 在我将 Kubuntu 升级到 22 04 后 我意识到当前的 venv 不起作用 我想我需要重新创建 venv 安装了 python3 10 venv 但我无法获取并激活它 事实上
  • Apache Spark:map、flatMap、mapPartitions、mapPartitionsWithIndex 的比较

    Apache Spark map flatMap mapPartitions mapPartitionsWithIndex 的比较 欢迎提出建议 以提高我们的知识 地图 函数 它有什么作用 通过提供的函数传递 RDD 的每个元素 即功能 平
  • 优化运行时间:改变igraph中边的权重需要很长时间。有没有办法优化它?

    我正在从 osmar 对象构建的 igraph 中搜索一组边 并希望更改这些边的权重 由于我的图表很大 因此这项任务需要很长时间 由于我在循环中运行此函数 因此运行时间变得更大 有什么办法可以优化这个吗 这是代码 library osmar