精华内容
下载资源
问答
  • 2012-05-28 06:23:03

    请描述一下多重继承在内存中的存储模型

      • 普通类在内存中的存储情况 

    VTAB(<- this)

     Data

      • 如果一个类有虚函数,那么它就有虚函数表,类的第一个单元是一个指针,指向这个虚函数表
      • 如果一个类没有虚函数,他的祖先(所有父类)均没有虚函数,那么它的内存映像和C语言里的结构一样
      • 如果类Y是是类X的一个继承(X是父类),那么类Y在内存中的结构如下

    YVTAB(<- this)

    Xdata

    Ydata

      • 现在看看class D多重继承
    class D : public A, public B, public C 
    
    { 
    
       .... 
    
    }
    
    
      • 有了这种多重继承关系之后,这几个类在内存中的存储结构如下,

    D的vTable(存的是一个指针)

    A的数据

    B的vTable(存的是一个指针)

    B的数据

    C的VTable(存的是一个指针)

    C的数据

    D的数据

      • 多重继承时,当把一个派生类强行转化成它的基类,它是能准确的找到他对应的虚函数表的。
      • 而通过这个多重继承中的某个基类,其实也能找到其对应的派生类的虚函数表(通过偏移)。
    更多相关内容
  • 尽管AMPAR的突触调节被认为是大脑信息存储的基础,尽管对此主题进行了大量研究,但AMPAR介导的突触可塑性仍存在不确定性。 但是,关于AMPAR贩运机制,有大量信息可用来开发突触可塑性的统一模型。 这样的模型可用于...
  • TESLA分析 用于研究与Tesla相关的所有内容的存储库。 包含/将包含:-电池收入模型-汽车产能模型-NPC现金流量分析-金融多重比较分析
  • 如何用R建立多重线性回归模型(上)

    千次阅读 2020-01-19 22:52:15
    多重线性回归模型的建立和简单线性回归模型一样,分为4步(文章直达链接) R中内置了很多数据集。其中有一个mtcars 数据集,它比较了不同的车型,每加仑里程(mpg),气缸排量(disp),马力(hp),汽车重量(...

    在之前的文章中,我介绍了如何用R建立简单线性回归模型。简单线性回归有一个特点,即自变量只有一个。但是实际生活中,往往影响因素有很多,因此有必要学习多重线性回归,即自变量不只有一个的情况。多重线性回归模型的建立和简单线性回归模型一样,分为4步(文章直达链接)

    R中内置了很多数据集。其中有一个mtcars 数据集,它比较了不同的车型,每加仑里程(mpg),气缸排量(disp),马力(hp),汽车重量(wt)和一些更多的参数。以下罗列了一部分:

    > datasets::mtcars
                         mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
    Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
    Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    .......................................................................
    .......................................................................
    Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
    Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
    

    (中间问个小问题,这个数据集是什么格式?另外,如何知道它有几行几列?我能想到两种方法,文末会公布答案。)

    数据比较多,只需要mpg,disp,hp,wt列的数据,并将存储到analysis_data变量中,并用head函数只显示前三行数据

    > analysis_data <- mtcars[,c("mpg","disp","hp","wt")]
    > head(analysis_data,n=3)
                   mpg disp  hp    wt
    Mazda RX4     21.0  160 110 2.620
    Mazda RX4 Wag 21.0  160 110 2.875
    Datsun 710    22.8  108  93 2.320
    

    通常,在构建模型之前,我们可以利用图像来查看变量间存怎样的近似关系。以本题为例,我们想知道mpg与单个变量之间是否存在一定的线性关系。调用GGally包中的ggpairs函数可以查看两两变量间的关系图。如下图所示

    在这里插入图片描述

    从图中可以看出,两两变量之间拟合效果不是很好,所以我们进一步推测mpg可能受disp,hp,wt影响。于是我们构建一个多元线性模型
    y = β 0 + β 1 x 1 + β 2 x 2 + β 3 x 3 y= \beta_0+\beta_1x_1+\beta_2x_2+\beta_3x_3 y=β0+β1x1+β2x2+β3x3

    其中

    y y y: mpg

    x 1 x_1 x1 : disp

    x 2 x_2 x2 :hp

    x 3 x_3 x3 : wt

    β 0 , β 1 , β 2 , β 3 ​ \beta_0,\beta_1,\beta_2,\beta_3​ β0,β1,β2,β3 为模型参数

    之前的教程中有说过用lm函数进行简单线性回归,对于多重回归分析,依然使用这个函数。如下:

    > result <- lm(analysis_data$mpg~analysis_data$disp+analysis_data$hp+analysis_data$wt)
    

    波浪线左边为因变量mpg,右边为一系列自变量,注意自变量之间用+连接

    关于多重线性回归,判断模型的指标有很多,下面我们一个个分析

    • 拟合方程的参数值、p值、决定系数( r 2 r^2 r2)

    首先,使用summary函数查看拟合的基本信息

    > summary(result)
    # 结果
    Call:
    lm(formula = analysis_data$mpg ~ analysis_data$disp + analysis_data$hp + 
        analysis_data$wt)
    
    Residuals:
       Min     1Q Median     3Q    Max 
    -3.891 -1.640 -0.172  1.061  5.861 
    
    Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
    (Intercept)        37.105505   2.110815  17.579  < 2e-16 ***
    analysis_data$disp -0.000937   0.010350  -0.091  0.92851    
    analysis_data$hp   -0.031157   0.011436  -2.724  0.01097 *  
    analysis_data$wt   -3.800891   1.066191  -3.565  0.00133 ** 
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 2.639 on 28 degrees of freedom
    Multiple R-squared:  0.8268,	Adjusted R-squared:  0.8083 
    F-statistic: 44.57 on 3 and 28 DF,  p-value: 8.65e-11
    

    其中,Coefficients是关于拟合的参数的信息,从上至下,分别是 β 0 , β 1 , β 2 , β 3 \beta_0,\beta_1,\beta_2,\beta_3 β0,β1,β2,β3 的基本信息。其中第一列为拟合参数的值。因此,拟合方程为:
    y = 37.10505 − 0.000937 x 1 − 0.0311 x 2 − 3.800891 x 3 y = 37.10505-0.000937x_1-0.0311x_2-3.800891x_3 y=37.105050.000937x10.0311x23.800891x3
    另外比较重要的一列是最后一列,p值,它反映了接受参数值为0这个原假设的可能性,这里如果小于0.05,那么参数值不为0,即参数值后的自变量对因变量存在显著影响,否则无影响。由上述数据可以看出disp对mpg无影响。因此我们需要重新构建我们的模型,少掉一个自变量, y = β 0 + β 1 x 1 + β 2 x 2 y= \beta_0+\beta_1x_1+\beta_2x_2 y=β0+β1x1+β2x2

    其中

    y y y: mpg

    x 1 x_1 x1 :hp

    x 2 x_2 x2 : wt

    重新用软件拟合

    > result <-lm(analysis_data$mpg~analysis_data$hp+analysis_data$wt)
    > summary(result)
    # 结果
    Call:
    lm(formula = analysis_data$mpg ~ analysis_data$hp + analysis_data$wt)
    
    Residuals:
       Min     1Q Median     3Q    Max 
    -3.941 -1.600 -0.182  1.050  5.854 
    
    Coefficients:
                     Estimate Std. Error t value Pr(>|t|)    
    (Intercept)      37.22727    1.59879  23.285  < 2e-16 ***
    analysis_data$hp -0.03177    0.00903  -3.519  0.00145 ** 
    analysis_data$wt -3.87783    0.63273  -6.129 1.12e-06 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    
    Residual standard error: 2.593 on 29 degrees of freedom
    Multiple R-squared:  0.8268,	Adjusted R-squared:  0.8148 
    F-statistic: 69.21 on 2 and 29 DF,  p-value: 9.109e-12
    

    可以看出这次p值都小于0.05,自变量对因变量mpg都有显著影响

    因此,拟合方程为
    y = 37.22727 − 0.03177 x 1 − 3.87783 x 2 − 3.800891 x 3 ( r 2 = 0.8268 ) y = 37.22727-0.03177 x_1-3.87783x_2-3.800891x_3 \quad (r^2 = 0.8268) y=37.227270.03177x13.87783x23.800891x3(r2=0.8268)

    • 误差平方和(SSE)和随机误差的方差

    为了得到回归模型的随机误差 ϵ \epsilon ϵ的标准误差 σ \sigma σ,可以采用计算样本数据的 s s s来估计它,其中
    s 2 = S S E 样 本 数 − 参 数 的 个 数 s^2 = \frac{SSE}{样本数-参数的个数} s2=SSE
    使用函数anova,来得到拟合结果的方差分析结果

    > anova(result)
    Analysis of Variance Table
    
    Response: analysis_data$mpg
                     Df Sum Sq Mean Sq F value    Pr(>F)    
    analysis_data$hp  1 678.37  678.37 100.862 5.987e-11 ***
    analysis_data$wt  1 252.63  252.63  37.561 1.120e-06 ***
    Residuals        29 195.05    6.73                      
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
    

    主要结果在Residuals那一行。因此,SSE = 195.03,s = 6.73

    可以验证( s = ( S S E 32 − 3 ) s = \sqrt(\frac{SSE}{32-3}) s=( 323SSE)

    • 参数的95%Cl

      另外一个评判模型的有用信息是计算参数的95%置信区间。在R中,直接使用confint函数查看:

      > confint(result)
                             2.5 %      97.5 %
      (Intercept)      33.95738245 40.49715778
      analysis_data$hp -0.05024078 -0.01330512
      analysis_data$wt -5.17191604 -2.58374544
      

      因此,对于$ \beta_1,\beta_2$ 置信区间分别为[-0.05,-0.01] 和 [-5.17,-2.58]

      我们对其 β 1 \beta_1 β1 的置信区间的含义进行解释 :我们有95%的把握认为,hp每增加一个单位,mpg会减少0.01-0.05。

    • 残差图

      利用残差图,可以看出残差分布是否随机,进而判断出模型的好坏。在R中,用plot函数可以查看

      我们主要查看残差图(下面第一张)和残差正态图(下面第二张)
      残差图
      残差的Q-Q图

    第一张中,残差无规律分布在拟合曲线旁边,表明残差分布随机。第二张,残差值近乎成一条直线,表明残差近似服从正态随机分布。

    好了,以上就是关于多重线性回归(上)的全部内容,喜欢的同学欢迎分享。在多重线性回归(下)这篇文章中,我将会介绍,如果模型中存在交互项怎么办,以及如何根据指定值和模型,进行预测。欢迎阅读。

    当当当,关于文中提到的问题

    • 问:mtcars 数据集是什么格式?

      答:data.frame类型

    • 问:如何知道mtcars 它有几行几列?

      答:方法一:

      > nrow(mtcars)   # nrow函数得到行数
      [1] 32
      > ncol(mtcars)   # ncol函数得到列数
      [1] 11
      

      方法2:

      > length(mtcars[,1])   # 第一列数据的长度就是行数
      [1] 32
      
      > length(mtcars[1,])   # 第一行数据的长度就是列数
      [1] 11
      

      ​内容同步更新到我的微信公众号,有理有数据
      在这里插入图片描述

    展开全文
  • 毫克冰川 一个描述和实施针对冰川模拟问题的新型多网格技术的项目。... 这是我编写的一个纸和Python程序,目的是使我完全不清楚全近似存储(FAS)方案。 发表到 。 有关详细信息,请参见fas/README.md 。
  • 为解决火车站堆场模型及其数据结构问题,按有向图和无向图对常用堆场模型... 结果表明,相邻多重链表适用于功能顶点模型和承载顶点模型,正交链表适用于开关组顶点模型和轨迹顶点模型,邻接矩阵适用于路线冲突图模型
  • 云环境为利用数据存储、访问和处理等前沿技术实现目标主机的全球各地随意访问,并且云计算针对客户提供了部分常用的服务模型和部署模型。这些特性使得用户能够通过第三方服务商利用简单的操作就能提供数据存储功能,...
  • 通过这种方式,我可以对数据预处理(包括在线数据增强)任务进行多重处理,并最大限度地利用 GPU。 亮点 #2 :除了数据增强(随机颜色失真、旋转、翻转和裁剪等),我还使用各种技巧来尝试为训练后的图像分类模型...
  • 存储模式

    2020-07-18 17:01:12
    图数据库使用图作为数据模型存储数据,完全不同于键值、列族和文档数据模型,可以高效地存储不同顶点间的关系。图数据库专门用于处理具有高度关联关系的数据,可以高效的处理实体之间的关系,比较适用于社交网络、...

    图存储模式

    1、图存储模式的概念

    图存储模式来源于图论中的拓扑学。图存储模式是一种专门存储节点的边以及节点之间的连线关系的拓扑存储方法。一个图是一个数学概念,用来表示一个对象集合,包括顶点以及连接顶点的边。节点和边都存在描述参数,边是矢量,即有方向的,可能是单向或双向的。

    图数据库使用图作为数据模型来存储数据,完全不同于键值、列族和文档数据模型,可以高效地存储不同顶点间的关系。图数据库专门用于处理具有高度关联关系的数据,可以高效的处理实体之间的关系,比较适用于社交网络、模式识别、依赖分析、推荐系统以及路径寻找等问题。

    2、图数据库的特征

    (原文链接:https://blog.csdn.net/heyc861221/article/details/80128421)

    1、包含节点和边;

    2、节点上有属性(键值对);

    3、边有名字和方向,并总是有一个开始节点和一个结束节点;

    4、边也可以有属性。

    通常,在图计算中,基本的数据结构表达就是:

    G=(V, E) 

    V=vertex(节点) 

    E=edge(边) 

    如图2所示。

    图2 简单的图数据库模型

    当然,图模型也可以更复杂,例如图模型可以是一个被标记和标向的属性多重图(multigraph)。被标记的图每条边都有一个标签,它被用来作为那条边的类型。有向图允许边有一个固定的方向,从末或源节点到首或目标节点。

    3、属性图

    属性图允许每个节点和边有一组可变的属性列表,其中的属性是关联某个名字的值,简化了图形结构。多重图允许两个节点之间存在多条边,这意味着两个节点可以由不同边连接多次,即使两条边有相同的尾、头和标记。如图3所示。

    图3 较为复杂的图模型

    图数据库存储一些顶点和边与表中的数据。他们用最有效的方法来寻找数据项之间、模式之间的关系,或多个数据项之间的相互作用。一张图里数据记录在节点,或包括的属性里面,最简单的图是单节点的,一个记录,记录了一些属性。一个节点可以从单属性开始,成长为成千上亿,虽然会有一点麻烦。从某种意义上讲,将数据用关系连接起来分布到不同节点上才是有意义的。

    在处理图数据时,其内部存储结构往往采用邻接矩阵或邻接表的方式,图4就是这两种存储方式的简单例子。在大规模并行图数据库场景下,邻接表的方式更加常用,大部分图数据库和处理框架都采用了这一存储结构。

    图4 大规模并行图数据库场景下的图数据库存储结构

    4、图数据库架构

    4.1、图数据库的两特性

           底层存储 

     一些图数据库使用原生图存储,这类存储是优化过的, 并且是专门为了存储和管理图而设计的。不过并不是所有图  数据库使用的都是原生图存储,也有一些会将图数据序列化,然后保存到关系型数据库或面向对象数据库,或是 其他通用数据存储中。

    原生图存储的好处是,它是专门为性能和扩展性设计 建造的。但相对的,原生图处理虽然在遍历查询时性能 优势很大,但代价是一些非遍历类查询会比较困难,而且 还要占用巨大的内存。

    处理引擎

    图计算引擎技术使我们可以在大数据集上使用全局图算法。图计算引擎主要用于识别数据中的集群,或是回答类似于“在一个社交网络中,平均每个人有多少联系?”这样的问题。

    一个成熟的图数据库架构应该至少具备图的存储引擎和图的处理引擎,同时应该有查询语言和运维模块,一个典型的图数据库架构如图5所示。

    图5 一个成熟的图数据库设计架构

    各模块功能说明如下:

           1、查询和计算:最终用户用于在此语言基础之上进行图的遍历和查询,最终返回运行结果。

           2、操作和运维:用于系统实时监控,例如系统配置、安装、升级、运行时监控,甚至包括可视化界面等。

    3、数据加载:包括离线数据加载和在线数据加载,既可以是批量的数据加载,也可以是流数据加载方式。

    4、图数据库核心:主要包括图存储和图处理引擎这两个核心。图处理引擎负责实时数

    图数据库不仅可以导入传统关系型数据库中的结构化数据,也可以是文本数据、社交数据、机器日志数据、实时流数据等。同时,计算结果可以通过标准的可视化界面展现出来,商业化的图数据库产品还应该能将图数据库中的数据进一步导出至第三方数据分析平台做进一步的数据分析。

    5、图数据库的应用

    1、用于联机事务图的持久化技术(通常直接实时地从应用程 序中访问)。

    2、这类技术被称为图数据库,它们和“通常的”关系型数据 库世界中的联机事务处理(Online Transactional Processing,OLTP)数据库是一样的。

    3、用于离线图分析的技术(通常都是按照一系列步骤执行)。

    这类技术被称为图计算引擎。它们可以和其他大数据分析 技术看做一类,如数据挖掘和联机分析处理(Online Analytical Processing,OLAP)。

    图数据库一般用于事务(OLTP)系统中。图数据库支持对图数据模型的增、删、改、查(CRUD)方法。相应地,它们也对事务性能进行了优化,在设计时通常需要考虑事务完整性和操作可用性。

    目前,业内已经有了相对比较成熟的基于图数据库的解决方案,大致可以分为以下几类。

    金融行业应用

    反欺诈多维关联分析场景

    通过图分析可以清楚地知道洗钱网络及相关嫌疑,例如对用户所使用的帐号、发生交易时的IP地址、MAC地址、手机IMEI号等进行关联分析。

    图6 在图数据库中一个典型的反洗钱模型

    反欺诈已经是金融行业一个核心应用,通过图数据库可以对不同的个体、团体做关联分析,从人物在指定时间内的行为,例如去过地方的IP地址、曾经使用过的MAC地址(包括手机端、PC端、WIFI等)、社交网络的关联度分析,同一时间点是否曾经在同一地理位置附近出现过,银行账号之间是否有历史交易信息等。

    社交网络图谱

    在社交网络中,公司、员工、技能的信息,这些都是节点,它们之间的关系和朋友之间的关系都是边,在这里面图数据库可以做一些非常复杂的公司之间关系的查询。比如说公司到员工、员工到其他公司,从中找类似的公司、相似的公司,都可以在这个系统内完成。

    图7 在图数据库中典型的社交关系网络模型

    企业关系图谱

    图数据库可以对各种企业进行信息图谱的建立,包括最基本的工商信息,包括何时注册、谁注册、注册资本、在何处办公、经营范围、高管架构。围绕企业的经营范围,继续细化去查询企业究竟有哪些产品或服务,例如通过企业名称查询到企业的自媒体,从而给予其更多关注和了解。另外也包括对企业的产品和服务的数据关联,查看该企业有没有令人信服的自主知识产权和相关资质来支撑业务的开展。

    企业在日常经营中,与客户、合作伙伴、渠道方、投资者都会打交道,这也决定了企业对社会各个领域都广有涉猎,呈现面错综复杂,因此可以通过企业数据图谱来查询,层层挖掘信息。基于图数据的企业信息查询可以真正了解企业的方方面面,而不再是传统单一的工商信息查询。

    6、图数据库的优缺点

    图数据库天生的特点决定了其在关联关系上具有完全的优势,特别是在我们这个社交网络得到极大发展的互联网时代。例如我们希望知道谁是谁的COLLEAGUE_OF(同事),谁是所有人的BOSS_OF(老板)。我们想知道谁没有市场了,因为他们和别人是MARRIED_TO(结婚)联系。我们甚至可以通过数据库在其他社交网络中发现不善交际的元素,用DISLIKES(不喜欢)联系来表示即可。

    虽然关系型数据库对于保存结构化数据来说依然是最佳的选择,但图数据库更适合于管理半结构化数据、非结构化数据以及图形数据。如果数据模型中包含大量的关联数据,并且希望使用一种直观、有趣并且快速的数据库进行开发,那么可以考虑尝试图数据库。

    展开全文
  • 研究光折变多重全息图分批热固定方法,依据热固定的基本理论模型研究离子补偿后的全息电子光栅在分批记录和定影过程中的光擦除特点。引入批间光擦除时间常数对多重全息图分批热固定的批间擦除特性进行定量描述,给出了...
  • leetcode 接口力码助手 该项目建立了一个网站,该网站为用户提供了先进的多重过滤器...模型查询提供了功能性的多重过滤、搜索和排名。 • 将网站部署在 PythonAnywhere 上并在发布后的第一周内获得了超过 5k 的访问量。
  • :针对统计假设检验的流和级联的多重检验校正 :在文本上学习图形模型的实验 使用此存储库时,请引用: @ARTICLE{Capdevila2018-Behaviormetrika, author = {Capdevila, Joan and Zhao, He and Petitjean, ...
  • 第2.2章:StarRocks表设计--数据模型

    千次阅读 2021-12-18 16:15:13
    为了全面的满足企业业务上的分析需求,StarRocks当前设计了四种数据模型:明细模型、聚合模型、更新模型、主键模型。 1明细模型 明细模型是StarRocks中最常用的数据模型,顾名思义,它会保留所有的明细数据,也...

    为了全面的满足企业业务上的分析需求,StarRocks当前设计了四种数据模型:明细模型、聚合模型、更新模型、主键模型。

    1明细模型

    明细模型是StarRocks中最常用的数据模型,顾名思义,它会保留所有的明细数据,也就是说,在明细模型下,即便导入两条完全相同的数据,StarRocks也会将数据原封不动的保存进表,不会进行聚合的操作,也没有update的语义。

    基于明细模型的特点,我们不难发现,明细模型通常用于追加式的数据写入,比较适合:

    1、需要保留原始数据的业务;

    2、查询维度不固定的业务;

    3、数据产生后就不会发生太多变化的业务。

    还是举一个简单的例子,在starrocks库中创建明细模型表table02:

    CREATE TABLE IF NOT EXISTS starrocks.table02 (

        event_time DATETIME NOT NULL COMMENT "datetime of event",

        event_type INT NOT NULL COMMENT "type of event",

        user_id INT COMMENT "id of user",

        channel INT COMMENT ""

    )

    DUPLICATE KEY(event_time, event_type,user_id)

    DISTRIBUTED BY HASH(user_id) BUCKETS 10;

    这里我们使用DUPLICATE KEY(event_time, event_type, user_id)显式的说明采用明细模型,并且指定排序键为event_time、event_type和user_id。排序键是指该表中数据存储时多重排序的次序,具体概念我们后面再讨论,这里先注意:

    1、若在数据列中我们未定义聚合函数(例如2.1章table01的total列),则默认采用明细模型;

    2、明细模型可以使用DUPLICATE KEY(列1,列2……)显式的说明使用明细模型,也可以整个省略;

    3、若显式指定使用明细模型,则DUPLICATE KEY(列1,列2……)中,排序键“列1、列2……”需要是建表语句中的前几列,且顺序需要和建表语句中的保持一致(例如table02中的event_time, event_type和table01中的user_id, device_code,device_price,event_time),否则建表会报错;

    4、在省略DUPLICATE KEY(列1,列2……)时,StarRocks通常也会默认为表选择前三列作为排序键。

    所以,table02的建表语句也可以简写为:

    CREATE TABLE IF NOT EXISTS starrocks.table02 (

        event_time DATETIME NOT NULL COMMENT "datetime of event",

        event_type INT NOT NULL COMMENT "type of event",

        user_id INT COMMENT "id of user",

        channel INT COMMENT ""

    )

    DISTRIBUTED BY HASH(user_id);

    我们对table02导入几条数据:

    mysql> insert into table02 values('2021-03-11',27,1001,01);

    mysql> insert into table02 values('2021-03-11',27,1001,01);

    mysql> insert into table02 values('2021-03-12',31,1002,02);

    mysql> select * from table02;

    +------------------------------+-------------------+-------------+--------------+

    | event_time                   | event_type     | user_id     | channel   |

    +------------------------------+-------------------+-------------+--------------+

    | 2021-03-12 00:00:00   |         31           |    1002     |       2         |

    | 2021-03-11 00:00:00   |         27           |    1001     |       1         |

    | 2021-03-11 00:00:00   |         27           |    1001     |       1         |

    +------------------------------+-------------------+-------------+--------------+

    可以发现,虽然导入的前两条数据完全相同,明细模型仍将其视为两条单独数据完整的保存进表。

    2聚合模型

    在上一篇概述章节我们已经举了一个聚合模型的例子,准确来说,聚合模型会在数据导入时将维度列相同的数据根据指标列设定的聚合函数进行聚合,最终表格中只会保留聚合后的数据。聚合模型可以减少查询时需要处理的数据量,进而提升查询的效率,其适合的场景如下:

    1、不需要原始的明细数据,只关注汇总的结果;

    2、业务涉及的查询为汇总类查询,比如sum、min、max、count等类型的查询;

    3、查询维度固定。

    再举一个聚合模型的例子,在starrocks库中建表table03:

    CREATE TABLE IF NOT EXISTS starrocks.table03 (

        site_id LARGEINT NOT NULL COMMENT "id of site",

        date DATE NOT NULL COMMENT "time of event",

        city_code VARCHAR(20) COMMENT "city_code of user",

        state INT COMMENT "web state",

        pv BIGINT SUM DEFAULT "0" COMMENT "total page views"

    )

    DISTRIBUTED BY HASH(site_id) BUCKETS 8;

    前面提到过,在建表时只要给指标列的定义指明聚合函数,就会启用聚合模型,所以这里我们省略了AGGREGATE KEY(site_id, date, city_code, state)。因为是聚合模型,这里的AGGREGATE KEY()要么整个省略,要么在小括号中给排序键按建表顺序指定所有的维度列,也即table03中没有聚合函数的前四列。在创建完成后,我们可以使用show create table语句查看表的创建语句,会发现是一样的。

    在聚合模型中,StarRocks还支持聚合函数REPLACE_IF_NOT_NULL。这个聚合类型的含义是当且仅当新导入数据是非NULL值时会发生替换行为,如果新导入的数据是NULL,那么StarRocks仍然会保留原值。我们可以借助这种聚合类型实现部分列导入的业务。

    3更新模型

    明细模型会将所有写入的数据保留,聚合模型是对写入的数据进行聚合处理,而更新模型的特点是只保留相同主键下最新导入的数据。在更新模型中,排序键构成表的唯一性约束,成为我们常说的“主键”。

    明细模型和聚合模型都不适合处理数据频繁更新的场景。比如在电商场景中,订单的状态经常会发生变化,每天的订单更新量可达到上亿,若在明细模型下通过delete+insert的方式实现更新,效率是比较低的,更新模型就是针对这种场景的实时数据分析设计的。

    这里我们创建一个订单类的表table04:

    CREATE TABLE IF NOT EXISTS starrocks.table04 (

        create_time DATE NOT NULL COMMENT "create time of an order",

        order_id BIGINT NOT NULL COMMENT "id of an order",

        order_state INT COMMENT "state of an order",

        total_price BIGINT COMMENT "price of an order"

    )

    UNIQUE KEY(create_time, order_id)

    DISTRIBUTED BY HASH(order_id) BUCKETS 8;

    不同于明细模型和聚合模型,这里的UNIQUE KEY(create_time, order_id)不能省略,且其中的排序键“create_time+order_id”构成了唯一主键,主键相同的数据,StarRocks只会保留最后导入的那一条。

    逻辑上,更新模型也可以理解为一种特殊的聚合模型。以table04为例,create_time和order_id为维度列,order_state和total_price为指标列,指标列聚合类型为REPLACE。

    为方便理解,我们为table04导入三条数据:

    mysql> insert into table04 values('2021-03-11',20210311001,01,100);

    mysql> insert into table04 values('2021-03-11',20210311001,02,200);

    mysql> insert into table04 values('2021-03-12',20210312001,01,100);

    前两条数据的主键相同,指标列不同,根据更新模型特点,我们推测出数据库中最终的数据应该是只保留第二条和第三条,导入完成后,我们查看数据:

    mysql> select * from table04;

    +---------------------+-------------------+--------------------+---------------------+

    | create_time       | order_id          | order_state      |  total_price       |

    +---------------------+-------------------+--------------------+---------------------+

    | 2021-03-11        | 20210311001 |           2            |         200           |

    | 2021-03-12        | 20210312001 |           1           |         100            |

    +---------------------+-------------------+--------------------+---------------------+

    数据情况符合预期。

    这里还需要注意,更新模型的“更新”,并不是说其支持update,而是通过追加式的数据写入,用新的数据去覆盖主键相同的历史数据,从而实现更新。同时,更新模型在导入数据时需要将所有字段补全才能够完成更新操作。

    更新模型建表时,我们通常将需要经常被过滤且不会被修改的字段放在“主键”上来提升查询性能。同时,我们也需要避免放置过多的“主键”字段,因为数据导入时的合并过程需要对所有“主键”字段进行比较,当“主键”字段较多时,整体的查询性能就会下降。假如某个字段只是偶尔会作为查询中的过滤条件存在,不需要放在“主键”中。

    对于更新模型的数据读取,因为需要在查询时完成多版本合并,当版本过多时会导致查询性能降低。所以在向更新模型导入数据时,应该适当降低导入频率,从而提升查询性能。建议在设计导入频率时以满足业务对实时性的要求为准。如果业务对实时性的要求是分钟级别,那么每分钟导入一次更新数据即可,不需要秒级导入。

    4主键模型

    明细模型、聚合模型和更新模型都不支持update语法,为实现update功能,StarRocks又自研了主键模型:primary key。

    主键模型与更新模型的特点比较接近,主键模型的表要求有唯一的主键,支持对表中的行按主键进行更新和删除操作。但对比更新模型,主键模型通过牺牲微小的写入性能和内存占用,极大提升了查询性能。同时,主键模型可以更好地支持实时/频繁更新的功能,特别适合MySQL或其他数据库同步到StarRocks的场景。以table05为例:

    create table starrocks.table05 (

        dt date NOT NULL,

        order_id bigint NOT NULL,

        user_id int NOT NULL,

        merchant_id int NOT NULL,

        good_id int NOT NULL,

        good_name string NOT NULL,

        price int NOT NULL,

        cnt int NOT NULL,

        revenue int NOT NULL,

        state tinyint NOT NULL

    ) PRIMARY KEY (dt, order_id)

    PARTITION BY RANGE(`dt`) (

        PARTITION p20210929 VALUES [('2021-09-29'), ('2021-09-30')),

        PARTITION p20210930 VALUES [('2021-09-30'), ('2021-10-01'))

    ) DISTRIBUTED BY HASH(order_id) BUCKETS 4

    PROPERTIES("replication_num" = "3");

    主键模型当前也还不直接支持update语法(后续会逐步支持),目前使用主键模型的限制也相对较多:

    1、主键列仅支持类型: boolean、tinyint、smallint、int、bigint、largeint、string/varchar、date和datetime,不允许NULL;

    2、分区列(partition)、分桶列(bucket)必须在主键列中;

    3、和更新模型不同,主键模型允许为非主键列创建bitmap等索引,但需要建表时指定;

    4、由于其列值可能会更新,主键模型目前还不支持rollup index和物化视图;

    5、Alter table目前仅支持添加/删除列,还不支持更改列类型和添加删除索引等操作;

    6、在设计表时应尽量减少主键的列数和大小以节约内存,建议使用int/bigint等占用空间少的类型。暂时不建议使用varchar。建议提前根据表的行数和主键列类型来预估内存使用量,避免出现OOM。内存估算举例:

    a. 假设表的主键为: dt date (4byte), id bigint(8byte) = 12byte

    b. 假设热数据有1000W行, 存储3副本

    c. 内存占用计算:(12 + 9(每行固定开销) ) * 1000W * 3 * 1.5(hash表平均额外开销) = 945M

    7、目前主键模型仍只支持整行更新,还不支持部分列更新。

    在1.19版本中,主键模型是作为“实验功能”发布的,由于存储引擎会为主键建立索引,而在导入数据时会把主键索引加载在内存中,所以主键模型对内存的要求比较高,后续版本也会不断的优化内存占用。目前推荐使用的场景有:

    1、数据有冷热特征,比如最近几天的热数据才经常被修改,老的冷数据很少被修改(老的业务数据导入完成后不再更新,新数据导入时老数据的主键索引就不会加载,也就不会占用内存,内存中仅会加载最近几天的索引);

    2、大宽表(数百到数千列)。主键只占整个数据的很小一部分,其内存开销比较低。

    主键模型的“插入/更新/删除”目前只支持使用“导入”的方式完成,通过SQL语句(insert/update/delete)来操作数据的功能会在未来版本中支持。目前支持的导入方式有stream load、broker load、routine load、Json数据导入,Spark load还未支持。

    关于主键模型的数据导入,官网文档中介绍的非常详细,这里不再赘述,文档地址:

    数据模型介绍 @ Data_model @ StarRocks Docsicon-default.png?t=LA92https://docs.starrocks.com/zh-cn/main/table_design/Data_model#%E6%8F%92%E5%85%A5%E6%9B%B4%E6%96%B0%E5%88%A0%E9%99%A4%E6%93%8D%E4%BD%9C

    特别注意:不要在1.19之前的版本中使用主键模型表,虽然可以创建成功,但功能无法正常使用。

    展开全文
  • 对象关系映射(ORM)已经被使用了很长时间,以解决在编程过程中对象模型与数据模型在关系数据库中不匹配的问题。 Dapper是由Stack OverFlow团队开发的开源的,轻量级的ORM.相比于其他的ORM框架,Dapper速度非常快。 ...
  • 基于当前的实验条件, 在半导体量子点中考虑声子辅助跃迁效应去构建环形四能级半导体量子点电磁感应透明介质模型。利用多重尺度法解析地研究了其中的时间光孤子的动力学行为。结果发现, 可以通过调整声子辅助跃迁强度...
  • 算法采用自助抽样技术对待分类数据中的属性进行裁剪和优化,解决了数据属性间的多重线性相关问题;算法结合贝叶斯算法的特点,采用动态增量存储树来解决动态样本数据流的存储问题,实现了无限动态数据流无信息失真的...
  • data member(数据成员),member function(成员函数),virtual member function(虚函数),以及在虚拟继承中,单继承,多重继承等各个角度,来探索C++类中的存储。 (申明,本文章中涉及的所有
  • 因此,同类的设备,控制模型大致是一样的。我们通常会在一个FB中,编写一段代码来实现对同一类设备的控制。如图1所示,为一段简单的电机启、停控制程序。图1 电机的启停控制模型简单分析一下这段程序:· #motor_on...
  • 实际上,它使您能够在较低维的数据结构(如Series (1d)和DataFrame (2d))中存储和操作具有任意维数的数据。 在本节中,我们将展示“分层”索引的确切含义,以及它如何与上面和前面几节中描述的所有panda索引功能集成...
  •  在我参加工作两年多的时候,工作不算很忙了,《深入理解C++对象模型》开始进入我的视野;或许是因为我要从Symbian.C++ 转向iOS Objective-C,并开始思考语言本身的一些东西的缘故。  其实在一年前,出于对C++的...
  • GitHub和邻近县中与科学和工程相关的存储库列表 内容 海洋 地球 空气 空间 技术 声学(水下) MatLab,Fortran ...-声学工具箱的GUI 不需要MatLab 海洋学(一般) -处理海洋数据集的有用命令的大杂烩 收音机 啪! .....
  • 存储库包含基于和的多分类图像分割模型的代码 用法 注意:使用 Python 3 数据集 确保将文件按以下结构放置: data ├── images | ├── 0a7e06.jpg │ ├── 0aab0a.jpg │ ├── 0b1761.jpg │ ├── ... |...
  • 地图数据的存储探索(GIS)

    千次阅读 2020-01-02 15:16:25
    地图数据的存储探索(GIS) 平常我们使用的地图,比如百度地图、高德地图、腾讯地图等等地图应用,全部都是基于地理信息的电子化展示,我平常开发使用地图的时候也大都是直接调用这些大厂的api,因为自己是计算机...
  • 多重星型模式  从(五)进阶技术1. “增加列”开始,已经通过增加列和表扩展了数据仓库,在(五)进阶技术5. “快照”里增加了第二个事实表,month_end_sales_order_fact表。这之后数据仓库模式就有了两个事实表...
  • 房价预测模型

    千次阅读 2022-05-01 16:17:04
    更具体地说,这是一个多重回归问题,因为系统要使用多个特征进行预测(使用区域的人口、收入中位数等)。这也是一元回归问题,因为我们仅尝试预测每个区域的单个值。 简单的批量学习应该就能胜任:我们没有一个连续...
  • 存储虚拟化概述

    万次阅读 2015-07-07 20:50:45
    存储虚拟化概述 一、基本概念   存储虚拟化(Storage Virtualization)最通俗的理解就是对存储硬件资源进行抽象化表现。典型的虚拟化包括如下一些情况:屏蔽系统的复杂性,增加或集成新的功能,仿真、整合或分解...
  • 多重共线性问题 文章目录前言一、多重共线性是什么?二、使用步骤1.引入库2.读入数据总结 前言 本文介绍多重共线性的相关知识 以下是本篇文章正文内容 一、多重共线性是什么? 要点: 定义在线性回归模型中 解释...
  • 对象存储(云存储)概述

    万次阅读 多人点赞 2019-03-08 17:54:09
    文章目录三种存储形态1、块存储2、文件存储3、对象存储对象存储对象存储需求对象存储含义对象存储与传统网络存储的区别扩展知识:NAS与SAN概述1、NAS(Network Attached Storage)优点局限2、SAN(Storage Area ...
  • Django 2.1.3 模型模型

    千次阅读 2018-11-17 18:04:35
    模型1.快速上手2.使用模型3.字段字段类型字段选项自动设置主键备注名关联关系多对一多对多多对多关系中额外字段一对一4.跨app引用模型5.字段名称限制 -- 译自官方文档+自己的理解 -- 模型是您的数据唯一而且准确的...
  • 本文总结了常用的数学模型方法和它们的主要用途,主要包括数学和统计上的建模方法,关于在数学建模中也挺常用的机器学习算法暂时不作补充,以后有时间就补。至于究竟哪个模型更好,需要用数据来验证,还有求解方法也...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,485
精华内容 15,794
关键字:

多重存储模型