标题:ParIS:快速时间序列索引和查询应答的下一个目标
本文与2018TKDE-ParIS+: Data Series Indexing on Multi-Core Architectures几乎是同一篇,一篇在会议,一篇在期刊,期刊文章做了些补充说明和优化,合并在一起说了。
第一款基于磁盘的数据序列索引,利用了现代硬件的并行性。
实验表明对于基于硬盘的数据,在索引构建过程中,Paris完全移除了CPU延迟(全部取决于IO)。
对于精确查找,是index方法的2个量级的提升,serial scan 3个量级的提升。
主要是源于多核+multi-socket的利用,另外一方面每个核又用了SIMD,使得索引构建和查询应答都得到了很大提升。
作者评估了执行速度和线程间通信之间的tradeoff,最后发现对于不同的硬件有不同的方案,让各个worker thread之间达到一个平衡以交换信息。
实验基于单个机器,用来最大化硬件的性能。但是也可以扩展到集群机器上去。
作者还基于SIMD做了一个向量式的iSAX下界距离。

因为I/O是主要的时间损耗,所以作者提出,构建索引时要尽量完成两个目标:
为了达到这两个目标,就要尽量减少各线程间的同步通信。

Stage1:coordinator worker从磁盘中读数据,读到的数据放进Raw Data Buffer。
Stage2:一组IndexBulkLoading Workers从Raw Data Buffer里面分区读数据,转换成iSAX形式,存入RecBufs和SAX数组。
Stage3:一组IndexConstruction从RecBufs中读取数据,构建iSAX Tree(ADS+ tree),建好之后,把叶子节点的数据flush到磁盘中。
Raw Data Buffer由两个数组buffer构成,corrdinator读满了B1,则启动一组IndexBulkLoading workers去处理B1,同时corrdinator向B2中读取数据。因此读取(I/O)和iSAX转换处理(CPU)可以同时进行,而负载的I/O可以mask out 掉CPU处理的时间。
Reciving Buffers就是ADS+树的第一层节点,每个节点一个buffer。

这三个阶段,不是严格的step-by-step的,raw data buffer读完了就会启动bulkloading过程;另外coordinator会记录当前读过的time series,一旦内存满了(到达一定界限),启动construction workers,分配RecBufs,flush掉当前内存里的time series。
indexbulkloading worker的个数通常是CPU核数-1,留下一个给cordinator。index-construction worker一般是CPU核数,此时coordinator也停止了读取工作。实际使用中5-6个worker已经足够让CPU的延迟被I/O mask out掉了。
在bulkloading的过程中,各个worker从raw data buffer不同的偏移量开始读取处理,这样就避免了同步。唯一需要同步的就是对RecBufs的锁,然而由于RecBufs有至多个,一般是几百到几千,workers最多也就几十个,所以锁的使用可以忽略不计了。
raw data buffer在作者的实验环境中用的是2MB,实验显示时延一开始递减,2MB之后开始趋于平稳,可以想到再大CPU也处理不过来了。
最后是index-construction过程,如下图,这个过程为每个local index的叶子节点,都分配了一个Output buffer。这个Output buffers收集叶子节点中的time series数据和iSAX表示。

每个worker依次去取一个RecBuf来处理,在Worker内部没有进行并行化。注意到由于time series是one-by-one插入的,所以叶子节点会经常分裂,此时要读取OutBufs,然后再分裂OutBufs。
Paris+:由于在这个过程中,index-construction workers的工作的一部分,就是构造iSAX树,这一块是CPU操作,然而没有被I/O mask掉。在Paris+中,可以让index-bulkloading worker兼容这部分工作,index-construction workers只负责flush OutBufs,使得CPU操作全部被mask掉。
总结:无论是Paris还是Paris+,实际上构建的都是一个非物化的索引,不改变原数据的组织,也没有涉及到数据的物化。
exact query的方式是首先进行approximate query,确定好一个BSF,然后再扫描全部序列。
近似query大部分都是内存操作,扫iSAX Tree到叶子节点即可。
扫描全部序列包含两部分,一部分是利用每个序列的iSAX,算下界距离;另一部分是合格的candidate算真实距离。
由于下界距离的计算本质上是一个向量计算(每个PAA做向量的一个元素),如下图,那么就可以使用SIMD的指令。然而下界距离有3种Case需要判断,根据不同的Case有不同的距离计算公式,SIMD不支持条件分支指令,因此作者的方案是,三种case全都算一遍。然后再单独产生3条mask串,定位每个PAA应该采取哪个case,每个结果都和mask做下AND,最后结果再or起来,就产生了最终的距离计算结果。
根据作者的实验,排除I/O的影响,SIMD也会比SISD快2.6倍。

多线程对SAX表分块,每个线程计算下界,满足条件的取数据,计算真实距离。只计算local BSF,各个线程不通信。和ADS+(sims)非常相似。
对于粗粒度的并行化,作者将之前整理好的SAX向量,分块,分给LBC(Lower bound calculation worker)进行计算,各个块之间也没有同步需求。
对于下界符合要求的进入candidate list,所有块完成之后,达成同步。
此后启动数量更多的RDC(real distance worker),由于IO操作更密集,因此数量要更多。这些RDC原子化的读取candidate,计算真实距离,原子化的更新BSF,最终得到结果。
作者从实验中得到结论,LBC每核一个,RDC每核5个左右,可以达到较好效果。

两台服务器,每台服务器两个处理器,每个处理器12核,75GB内存。
这个实验环境有些复古,单机有非常顶级的服务器配置,有足够大的内存
首先是索引构建时间,用的数据集是合成的,100M个序列,110GB大小。整体来说和ADS+在一个量级上,少1倍时间左右。
比较值得关注的是Fig.6,构建时间图。可以看到IndexBulkLoading Workers在6核及以上的时候,可以完全被raw data read cover掉,当然这是由于实验环境内存足够大的时候。
另外,虽然indexConstruction workers可以很快构建iSAX Tree,但是把OutBufs flush到磁盘里,还是占据了大量的时间。


PARIS多核并发读SAX分区,单核内SIMD用于下界距离计算,SIMD也可以用于精确距离计算。
图中的ADS+应该不是ADS+(SIMS)。
从实验结论看出,均衡的线程间工作分配,和较为连续的磁盘读,使得Paris+性能很不错。

这个过程因为有大量的随机读取,所以SSD比HDD快了很多,实验没有给出精确数据,从图中看,在SSD上,250GB仅有几秒的响应,已经是史无前例的了。

作者提到,future work可以有三个部分:
BigData/CloudComputing:基于阿里云技术产品的人工智能与大数据/云计算/分布式引擎的综合应用案例目录来理解技术交互流程目录一、云计算网站建设:部署与发布网站建设:简单动态网站搭建云服务器管理维护云数据库管理与数据迁移云存储:对象存储管理与安全超大流量网站的负载均衡二、大数据MOOC网站日志分析搭建企业级数据分析平台基于LBS的热点店铺搜索基于机器学习PAI实现精细化营销基于机器学习的客户流失预警分析使用DataV制作实时销售数据可视化大屏使用MaxCompute进行数据质量核查使用Quick BI制作图形化报表使用时间序列分解模型预测商品销量三、云安全云平台使用安全云上服务
目录一、试题描述1、任务2、基本功能要求3、发挥要求4、说明二、开发板介绍 三、所用器件:1一个超声波测距传感器2eeprom3电位器44*4矩阵键盘5蜂鸣器6led灯7步进电机8RTC实时时钟9所用芯片 四、主要思路一、试题描述1、任务 设计并制作汽车倒车防撞报警器。开机后,屏幕第一行显示“DCFZBJQ”,第二行显示“抽签号后4位”(如0207),并自下而上滚动,3秒后停止滚动。画出系统各组件连接图,并简要说明,画出键盘图并标注各键功能。画出全部程序流程图。2、基本功能要求 (1)应用超声波传感器实现距离采集,并在12864点阵屏上显示。利用实验桌面到房顶距离(
打开题目就是源码,审一下。 知识点:escapeshellarg —把字符串转码为可以在shell命令里使用的参数功能 :escapeshellarg()将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入shell函数,shell函数包含exec(),system()执行运算符(反引号)定义 :stringescapeshellarg(string$arg)escapeshellcmd —shell元字符转义功能:escapeshellcmd() 对字符串中可能会欺骗shell命令执行任意命令的字符进行转义。此函数保证用户输入的数据在传送到 ex
是的,我知道这是重复的,但是自提供映射模板解决方案以来情况发生了变化here,here和here被设计出来。使用代理集成(AWS推荐的方法),无法访问模板。那么现在如何访问标题?我试过将对象模型用于以下内容:event.headersevent.headers["X-Requested-With"]varheaderItem="x-requested-with"event.headers.headerItem等似乎没有任何定义。根据Cloudwatch的说法,该事件是:{"resource":"/contactformlambda","path":"/contactformlambda
这个问题在这里已经有了答案:convertYYYYMMDDstringtoavaliddateinGo(2个答案)关闭4年前。如何像这样在golang中获取日期formate"2018-07-13"main.go文件packagemainimport("fmt""time")funcmain(){fmt.Println(time.Now())}$gorunmain.go输出:2018-07-1321:25:16.796379489+0500+05m=+0.000120455如何编写函数以像这样的格式“2018-07-13”在字符串中返回日期?
如何在golang中解析这个奇怪的日期时间2018-10-22T2250?我找不到日期布局 最佳答案 您可以创建自己的自定义格式。在生产中,您还应该处理错误。packagemainimport("fmt""time")funcmain(){timeString:="2018-10-22T2250"timeFormat:="2006-01-02T1504"t,_:=time.Parse(timeFormat,timeString)fmt.Println(t)}Playgroundlink这将返回UTC时间。您可能需要调整到另一个时区,
我花了很长时间研究这个。大多数解决方案发布于2018年4月之前,涉及通过“设置”逐步进入“按文件类型选择默认应用”的方法。ChoosedefaultAppsbyfiletype在先前尝试将应用程序分配给“.rex”的过程中,我设法将其分配给记事本。(当时,我找不到在C:驱动器上找到“.exe”的任何方法。)如您所见,如果单击.rex扩展名旁边的记事本,则唯一的选择是转到“应用程序商店”。和预期的一样,如果您单击AppStore,将找不到任何内容...Appstore-noapp'sfound.因此,从我在2018年4月之前在多个论坛上阅读的内容来看,Windows10仍然可以通过“浏览
有人可以告诉发布管理(客户端/服务器模型)胖客户端是否与TFS2018兼容我们正在使用Releasemanagement2015富客户端和tfs2015并计划升级到TFS2018,并想检查这是否兼容 最佳答案 ReleaseManagementServer已弃用。自TFS2015以来,它没有收到更新,以后也不会收到更新。自TFS2015更新2以来,发布管理功能已集成到TeamFoundationServer(TFS)和VSTS的构建和发布中心中。较新的基于Web的版本是服务器和客户端版本的推荐替代方案。简而言之,是的,您仍然可以将R
几个月来,我们一直在跟踪Windows上的Meltdown和Spectre缓解措施的性能问题。几天前,我们发现了一些奇怪的结果。在我们的Windows10FCU机器上应用2018年4月累积更新(KB4093112)后,突然之间,我们观察到的性能影响消失了,我们运行的所有基准测试都回到了未应用缓解措施时的相同水平。例如,下面是CrystalMark2004R3报告的GDI性能数字(我们运行了多个基准测试以及我们自己的应用程序基准测试,所有这些都使性能数字回到了Meltdown/Spectre之前的水平)Win10FCUVanilla(noMeltdown/Spectremitigatio
我需要显示一次向导,这是我的Windows窗体应用程序在安装后第一次运行时。我想我可以使用像firstrun=false这样的用户设置。但是我还需要处理卸载程序然后重新安装的情况。该用户设置将如何重置?它已经存在于该用户的...\Users--user--\AppData\Roaming...的配置文件中。我需要在重新安装后运行该向导,因此我需要重置该设置。我是否需要使用自定义安装程序操作来执行此操作? 最佳答案 最好让您的安装程序在注册表中创建FirstRun键并将其设置为true(或1或其他),并确保您的卸载程序完全删除该键。然