热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

聚合时data.table多列非等值联接的性能降低

如何解决《聚合时data.table多列非等值联接的性能降低》经验,需要怎么解决?

我正在尝试查找性能问题,并将其很大程度上隔离为多列非等额联接。以下是我尝试做的事情的合理(但不是确切)示例,以及时间安排。

library(quantmod)
library(data.table)

p <- last(OHLC(getSymbols("SPY", auto.assign = F,)), 700)
d <- as.data.table(p) #convert to a data.table for processing
d[, index := as.POSIXct(index)] #to match my use case. leaving as Date does not significantly alter timings
setnames(d, c("index", "Open", "High", "Low", "Close"))

# create partitions for analysis
partitiOns= unique(d[d, .(Top = x.Close, Bot = i.Close, Start = pmin(x.index, i.index)),
    on = .(Close >= Close), allow.cartesian = T][!is.na(Start)])

#desired analysis
system.time(r1 <- d[partitions, .(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close)),
    on = .(Close >= Bot, Close <= Top, index >= Start), allow.cartesian = T, by = .EACHI])
#7.67

具有相同数据集的单列连接要快得多(但不会产生所需的结果)。只是在这里进行时间比较:

system.time(r2 <- d[partitions, .(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close)),
    on = .(Close >= Bot, Close <= Top), allow.cartesian = T, by = .EACHI])
#4.4
system.time(r4 <- d[partitions, .(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close)),
    on = .(index >= Start), allow.cartesian = T, by = .EACHI])
#4.67

我知道,如果减少partition表中的行数,我可以加快速度,但是我已经尽我所能走了很远,而且速度仍然很慢。我也理解这要求在引擎盖下实现非常大的连接,但是仅凭单列约束,该实现的连接就更大了,因此相对性能仍然困扰着我。

难道我做错了什么?我真的不明白为什么添加第二列条件会导致如此急剧的下降。关于如何使其更快的任何建议?

编辑7/30/18

因此,在verbose=T尝试了非常有用的功能之后,我发现了问题的另一个方面。median()在这种情况下,这似乎非常慢:

首先,使用mean()带有详细输出的现有分析:

r1 <- d[partitions, .(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close)),
    on = .(Close >= Bot, Close <= Top, index >= Start), allow.cartesian = T, by = .EACHI, verbose = T]

Non-equi join operators detected ... 
  forder took ... 0.000sec 
  Generating non-equi group ids ... done in 0.000sec 
  Recomputing forder with non-equi ids ... done in 0.000sec 
  Found 26 non-equi group(s) ...
Starting bmerge ...done in 0.790sec 
Detected that j uses these columns: i.Top,i.Bot,i.Start,x.Close 
lapply optimization is on, j unchanged as 'list(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close))'
Old mean optimization changed j from 'list(i.Top, i.Bot, i.Start, mean(x.Close), sd(x.Close))' to 'list(i.Top, i.Bot, i.Start, .External(Cfastmean, x.Close, FALSE), sd(x.Close))'
Making each group and running j (GForce FALSE) ... 
  collecting discontiguous groups took 0.077s for 235273 groups
  eval(j) took 4.475s for 235273 calls
4.690sec 

接下来,再次使用中值()进行类似分析,并输出详细信息:

r1 <- d[partitions, .(i.Top, i.Bot, i.Start, median(x.Close), sd(x.Close)),
    on = .(Close >= Bot, Close <= Top, index >= Start), allow.cartesian = T, by = .EACHI, verbose = T]
Non-equi join operators detected ... 
  forder took ... 0.000sec 
  Generating non-equi group ids ... done in 0.000sec 
  Recomputing forder with non-equi ids ... done in 0.000sec 
  Found 26 non-equi group(s) ...
Starting bmerge ...done in 0.810sec 
Detected that j uses these columns: i.Top,i.Bot,i.Start,x.Close 
lapply optimization is on, j unchanged as 'list(i.Top, i.Bot, i.Start, median(x.Close), sd(x.Close))'
Old mean optimization is on, left j unchanged.
Making each group and running j (GForce FALSE) ... 
  collecting discontiguous groups took 0.079s for 235273 groups
  eval(j) took 12.826s for 235273 calls
13.1sec 

以供参考:

> getOption("datatable.optimize")
[1] Inf

所以,我想另一个问题是:median()non-equi通过by连接的上下文中,有什么方法可以加快通话速度吗? .EACHI


推荐阅读
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 从批量eml文件中提取附件的Python代码实现方法
    本文介绍了使用Python代码从批量eml文件中提取附件的实现方法,包括获取eml附件信息、递归文件夹下所有文件、创建目的文件夹等步骤。通过该方法可以方便地提取eml文件中的附件,并保存到指定的文件夹中。 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • #define_CRT_SECURE_NO_WARNINGS#includelist.h#includevoidSListInit(PNode*pHead ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
  • ①页面初始化----------收到客户端的请求,产生相应页面的Page对象,通过Page_Init事件进行page对象及其控件的初始化.②加载视图状态-------ViewSta ... [详细]
author-avatar
山野木每子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有