精华内容
下载资源
问答
  • java中获取随机数、随机字符串常用方法

    万次阅读 多人点赞 2016-07-22 17:23:24
    在日常工作当中,经常会有需要获取随机数、随机字符的需求,如:生成随机数验证码、生成随机字符串...这些场景其根本都在于随机数的生成,本文将对java当中生成随机数、随机字符等常见应用场景及获取方法进行简单小结。

    一、前言
      在日常工作当中,经常会有需要获取随机数、随机字符的需求,如:生成随机数验证码、生成随机字符串签名、生成2个数字之间的随机数等。这些场景其根本都在于随机数的生成,本文将对java当中生成随机数、随机字符等常见应用场景及获取方法进行简单小结。

    二、伪随机、真随机数简介  
      计算机很难产生真正意义上的真随机数,通常我们所说的产生随机数,都是指伪随机数。从一定意义上来说,计算机本身几乎是不可能产生真正意义上的真随机数的,因为其一定是按照一定的运算规则来获取随机数的;当然,伪随机数的并不是说这个随机数就是假的,而是指,这个生成的随机数是按指定规律运算出来的相对随机的一个数。这些规律就是指各种编程语言中生成随机数的算法,java当中用的算法之一是线性同余算法。(具体介绍请参考http://t1174779123.iteye.com/blog/2037719
      
    三、Java本身的生成随机数相关方法简介
      Java本身有2个常用的类来生成随机数,一个是直接使用java.lang.Math类中的Math.random()方法获取一个[0.0,1.0)之间的一个double类型的随机数;另一个是通过java.util.Random类,创建一个随机数发生器,然后再生成随机数。通过查看源码可以发现,Math.random()本身其实也是通过java.util.Random类来实现生成随机数的,只是说,其使用起来更加简单方便。

    //--JDK1.7中,Math.random()部分源码
    private static Random randomNumberGenerator;
    private static synchronized Random initRNG() {
         Random rnd = randomNumberGenerator;
         return (rnd == null) ? (randomNumberGenerator = new Random()) : rnd;
    }
    public static double random() {
            Random rnd = randomNumberGenerator;
            if (rnd == null) rnd = initRNG();
            return rnd.nextDouble();
    }

    1、Math.random()
      Java中的java.lang.Math类包含常见的一些数学公式函数,如:Math.round(n)四舍五入取整,Math.sqrt(n)计算平方根,Math.abs(n)计算绝对值等;而Math.random()函数则是获取一个[0.0,1.0)之间一个double类型的伪随机数
      通过Math.random()获取一个[0.0,1.0)之间的随机数后,我们就可以通过简单运算获取值在[m,n)之间的随机数了; 如: Math.random()*10就可以获取一个[0.0,10.0)之间的一个随机数,Math.random()*10+5就可以获取一个[5.0,15.0)之间的一个随机数,然后将获取的随机数进行数据类型转换就可以获取我们最终所需的随机数。
      获取公式:(条件:0<=m<=n)
      [m,n)之间:(数据类型)(m+Math.random()*(n-m));
      [m,n]之间:(数据类型)(m+Math.random()*(n-m+1));
    2、java.util.Random类
      Java中的java.util.Random类可以创建一个随机数发生器,其构造函数有2个,分别是Random()Random(long seed),前一个是创建不指定种子的随机数生成器,后一个是创建指定种子的随机数生成器,然后通过生成器生成随机数。
      种子,指生成随机数算法的起始数字,和生成的随机数的区间没有任何关系。Random()构造函数其实默认会指定种子,老版本的JDK用的是System.currentTimeMillis()方法获取当前计算机时间作为种子,而新版本的JDK用的是System.nanoTime()方法获取当前cpu核心纳秒级时间作为种子。(两者区别请参考http://blog.csdn.net/dliyuedong/article/details/8806868

    //笔者jdk1.7.0.79版本的Random()构造函数源码
    public Random() {
        this(seedUniquifier() ^ System.nanoTime());
    }

    指定种子的话,如果种子值相同,无论执行多少次,其将生成同一随机数列
    例1:

    public class TestRandom {
        public static void main(String[] args) {
            Random random1 = new Random(10);
            Random random2 = new Random(10);
            int random1_1 = random1.nextInt(100);
            int random1_2 = random1.nextInt(100);
            int random2_1 = random2.nextInt(100);
            int random2_2 = random2.nextInt(100);
    
            System.out.println("random1_1->" + random1_1);
            System.out.println("random1_2->" + random1_2);
            System.out.println("random2_1->" + random2_1);
            System.out.println("random2_2->" + random2_2);
        }
    }

    无论执行多少次,其输出结果均为:

    random1_1->13
    random1_2->80
    random2_1->13
    random2_2->80

      Random类中有许多生成随机数的方法,如Math.random()其实就是调用Random类中的nextDouble()方法来获取随机数。这里对其中常用的方法简单说明一下:

    //返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值
    public int nextInt();
    //返回一个伪随机数,它是取自此随机数生成器序列的、在(包括和指定值(不包括)之间均匀分布的int值
    public int nextInt(int n);
    // 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值
    public long nextLong();
    // 返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布float值
    public float nextFloat();
    // 返回下一个伪随机数,它是取自此随机数生成器序列的、在0.0和1.0之间均匀分布的
    public double nextDouble();
    // 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的boolean值。
    public boolean nextBoolean();

      基本上有以上常用方法,就可以通过简单运算获取我们最终所需的随机数了,运算方法可以参考第1点说明;当然,Random类还有其它获取随机数的方法,感兴趣的朋友可以去了解一下。
      
    四、常见的随机数使用场景及生成方法
    (注意值的闭包区间)
    1、获取指定数值内的随机数
    例2:

    //获取[0,n)之间的一个随机整数
    public static int getRandom(int n) {
        return (int) (Math.random() * n);
    }

    2、获取2个数字区间内的随机数
    例3:

    //获取[m,n]之间的随机数(0<=m<=n)
    public static int getRandomBetweenNumbers(int m,int n){     
        return (int)(m + Math.random() * (n - m + 1));
    }

    此方法可用于生成随机验证码。
    3、获取指定长度的随机字符串
      Java本身并没有生成随机字符串的方法,但我们可以通过java自带的随机数方法运算获取所需的随机字符串。
    例4:

    //获取指定位数的随机字符串(包含小写字母、大写字母、数字,0<length)
    public static String getRandomString(int length) {
        //随机字符串的随机字符库
        String KeyString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        StringBuffer sb = new StringBuffer();
        int len = KeyString.length();
        for (int i = 0; i < length; i++) {
           sb.append(KeyString.charAt((int) Math.round(Math.random() * (len - 1))));
        }
        return sb.toString();
    }

      在这个例子中,我们先自定义一个字符串库KeyString ,然后通过Math.random()方法获取KeyString长度内的一个随机数,接着再获取该随机数对应KeyString中相应位置的一个字符,最后将随机获取并组装好的字符串返回。
      大家可以发现,这个例子获取的随机字符串可能包含小写字母、大写字母、数字;如果说还需要包含其它字符的话,如%、#、/、* 等特殊字符,只需将相应字符添加到字符串库KeyString 中去即可;同理,若想生成只包含小写字母或者只包含数字的字符串,也只需修改字符串库KeyString 即可。可以说,这几乎是获取随机字符串的一个“万金油”方法。

    4、随机生成指定概率的数字
      获取指定值内的随机数,从理论上来说,每个数字出现概率都是一样的,但是,我们可以通过一定的运算实现按一定的概率获取数字。
      如:我们想随机生成0、1这两个数字,但是呢,我们希望0出现的概率为70%,1出现的概率为30%;这个时候,我们可以通过用一定的随机数区间值来分别表示0、1,从而实现按概率获取随机数。
    例5:

    //输出0或者1;0出现的概率为70%,1出现的概率为30%
    public class TestRandom {
        public static void main(String[] args){
            Random random = new Random();
            int n = random.nextInt(100);
            if(n < 70){
                System.out.println("0");
            }else{
                System.out.println("1");
            }
        }   
    }

      由以上示例可知,通过一定的运算,我们就可以按一定概率获取数字,非常简单的抽奖小游戏就可以使用这种方式来设置中奖概率。
    例6:

    //简单的按概率获取数字,注意定义数组时的概率总和需为100%
    public class TestRandom {
        public static void main(String[] args) {
            //各数字出现的概率分别是:1(10%)、2(20%)、3(30%)、4(40%)
            float[][] array = new float[][]{{1,10},{2,20},{3,30},{4,40}};  
            int n = luckDraw(array,new Random());
            if(1 == n){
                System.out.println("一等奖");
            }else if(2 == n){
                System.out.println("二等奖");
            }else if(3 == n){
                System.out.println("三等奖");
            }else if(4 == n){
                System.out.println("谢谢参与");
            }
        }
        //简单幸运抽奖
        public static int luckDraw(float[][] array,Random random){
            int n = 10000;  //总值
            int length = array.length;
            int random_num = random.nextInt(n); //随机数
            for(int i=0;i<length;i++){
                float before_chance = 0;    //当前概率值之前的总概率
                for(int j=0;j<i;j++){
                    before_chance = before_chance + array[j][1]; 
                }
                int value = (int) (array[i][1] / 100 * n); //区间
                int up = (int) (before_chance / 100 * n);   //大于等于该值
                int under = up + value;  //小于该值
                if((up <= random_num) && (random_num < under)){
                    return (int) array[i][0];
                }
            }
            return 0;
        }
    }

      需要指出的是,这只是一个非常简单的小示例,只适用于要求较低的场景。真正严格意义上的抽奖有许多要求,如总出奖数量、每个奖的概率随时间的推移而变化等,有专门的一些算法去实现抽奖中的各种概率问题,感兴趣的朋友可以去了解一下。
      
    五、总结
    1、Math.random()方法和Random类获取随机数的实现方法相同,只是相对而言,Math.random()的使用更简洁便利,而Random类的方法更丰富、使用更加灵活。
    2、高并发系统中,即使种子为毫秒级,java.util.Random类获取的随机数,还是可能会相同,从而给系统带来潜在风险。
    3、随机数是相对随机的,伪随机数生成效率高,而真随机数可能需要一定的硬件支持且生成效率低;并没有说哪个就一定好,凡事都有相对性,我们可以根据自己业务场景所需选择。



    参考文章

    1、http://t1174779123.iteye.com/blog/2037719
    2、http://blog.csdn.net/dliyuedong/article/details/8806868
    3、http://blog.sina.com.cn/s/blog_93dc666c0101h3gd.html
    4、http://abc20899.iteye.com/blog/1124583

    展开全文
  • 随机采样方法

    千次阅读 2016-08-04 16:35:40
    这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis, 在美国洛斯阿拉莫斯国家实验室研究裂变物质的中子连锁反应的时候...

    背景

    随机模拟也可以叫做蒙特卡罗模拟(Monte Carlo Simulation)。这个方法的发展始于20世纪40年代,和原子弹制造的曼哈顿计划密切相关,当时的几个大牛,包括乌拉姆、冯.诺依曼、费米、费曼、Nicholas Metropolis, 在美国洛斯阿拉莫斯国家实验室研究裂变物质的中子连锁反应的时候,开始使用统计模拟的方法,并在最早的计算机上进行编程实现。

    随机模拟中有一个重要的问题就是给定一个概率分布p(x),我们如何在计算机中生成它的样本。一般而言均匀分布 Uniform(0,1)的样本是相对容易生成的。 通过线性同余发生器可以生成伪随机数,我们用确定性算法生成[0,1]之间的伪随机数序列后,这些序列的各种统计指标和均匀分布 Uniform(0,1) 的理论计算结果非常接近。这样的伪随机序列就有比较好的统计性质,可以被当成真实的随机数使用。

    下面总结这么几点:

    1、蒙特卡洛数值积分

    2、均匀分布,Box-Muller 变换

    3、Monte Carlo principle

    4、接受-拒绝抽样(Acceptance-Rejection sampling)

    5、重要性抽样(Importance sampling)

    6、马尔科夫链,马尔科夫稳态

    7、MCMC——Metropolis-Hasting算法

    8、MCMC——Gibbs Sampling算法

    1、蒙特卡洛数值积分

    如果我们要求f(x)的积分,如

    而f(x)的形式比较复杂积分不好求,则可以通过数值解法来求近似的结果。常用的方法是蒙特卡洛积分:

    这样把q(x)看做是x在区间内的概率分布,而把前面的分数部门看做一个函数,然后在q(x)下抽取n个样本,当n足够大时,可以用采用均值来近似:

    因此只要q(x)比较容易采到数据样本就行了。随机模拟方法的核心就是如何对一个概率分布得到样本,即抽样(sampling)。下面我们将介绍常用的抽样方法。

    2、均匀分布,Box-Muller 变换

    在计算机中生成[0,1]之间的伪随机数序列,就可以看成是一种均匀分布。而随机数生成方法有很多,最简单的如:

    当然计算机产生的随机数都是伪随机数,不过一般也就够用了。

    [Box-Muller 变换] 如果随机变量 U1,U2 独立且U1,U2∼Uniform[0,1],

    则 Z0,Z1 独立且服从标准正态分布。

    3、Monte Carlo principle

    Monte Carlo 抽样计算随即变量的期望值是接下来内容的重点:X 表示随即变量,服从概率分布 p(x), 那么要计算 f(x) 的期望,只需要我们不停从 p(x) 中抽样xi,然后对这些f(xi)取平均即可近似f(x)的期望。

    4、接受-拒绝抽样(Acceptance-Rejection sampling)

    很多实际问题中,p(x)是很难直接采样的的,因此,我们需要求助其他的手段来采样。既然 p(x) 太复杂在程序中没法直接采样,那么我设定一个程序可抽样的分布 q(x) 比如高斯分布,然后按照一定的方法拒绝某些样本,达到接近 p(x) 分布的目的,其中q(x)叫做 proposal distribution 。

    具体操作如下,设定一个方便抽样的函数 q(x),以及一个常量 k,使得 p(x) 总在 kq(x) 的下方。(参考上图)

    • x 轴方向:从 q(x) 分布抽样得到 a。(如果是高斯,就用之前说过的 tricky and faster 的算法更快)
    • y 轴方向:从均匀分布(0, kq(a)) 中抽样得到 u。
    • 如果刚好落到灰色区域: u > p(a), 拒绝, 否则接受这次抽样
    • 重复以上过程

    在高维的情况下,Rejection Sampling 会出现两个问题,第一是合适的 q 分布比较难以找到,第二是很难确定一个合理的 k 值。这两个问题会导致拒绝率很高,无用计算增加。

    5、重要性抽样(Importance sampling)

    Importance Sampling 也是借助了容易抽样的分布 q (proposal distribution)来解决这个问题,直接从公式出发:

    其中,p(z) / q(z) 可以看做 importance weight。我们来考察一下上面的式子,p 和 f 是确定的,我们要确定的是 q。要确定一个什么样的分布才会让采样的效果比较好呢?直观的感觉是,样本的方差越小期望收敛速率越快。比如一次采样是 0, 一次采样是 1000, 平均值是 500,这样采样效果很差,如果一次采样是 499, 一次采样是 501, 你说期望是 500,可信度还比较高。在上式中,我们目标是 p×f/q 方差越小越好,所以 |p×f| 大的地方,proposal distribution q(z) 也应该大。举个稍微极端的例子:

    第一个图表示 p 分布, 第二个图的阴影区域 f = 1,非阴影区域 f = 0, 那么一个良好的 q 分布应该在左边箭头所指的区域有很高的分布概率,因为在其他区域的采样计算实际上都是无效的。这表明 Importance Sampling 有可能比用原来的 p 分布抽样更加有效。

    但是可惜的是,在高维空间里找到一个这样合适的 q 非常难。即使有 Adaptive importance sampling 和 Sampling-Importance-Resampling(SIR) 的出现,要找到一个同时满足 easy to sample 并且 good approximations 的 proposal distribution, it is often impossible!

    6、马尔科夫链,马尔科夫稳态

    在讲蒙特卡洛方法之前,必须要先讲一下马尔科夫链;马氏链的数学定义:

    也就是说前一个状态只与当前状态有关,而与其他状态无关,Markov Chain 体现的是状态空间的转换关系,下一个状态只决定与当前的状态(可以联想网页爬虫原理,根据当前页面的超链接访问下一个网页)。如下图:

    举一个例子,如果当前状态为 u(x) = (0.5, 0.2, 0.3), 那么下一个矩阵的状态就是 u(x)T = (0.18, 0.64, 0.18), 依照这个转换矩阵一直转换下去,最后的系统就趋近于一个稳定状态 (0.22, 0.41, 0.37) (此处只保留了两位有效数字)。而事实证明无论你从那个点出发,经过很长的 Markov Chain 之后都会汇集到这一点。

    再举一个例子,社会学家经常把人按其经济状况分成3类:下层(lower-class)、中层(middle-class)、上层(upper-class),我们用1,2,3 分别代表这三个阶层。社会学家们发现决定一个人的收入阶层的最重要的因素就是其父母的收入阶层。如果一个人的收入属于下层类别,那么他的孩子属于下层收入的概率是 0.65, 属于中层收入的概率是 0.28, 属于上层收入的概率是 0.07。事实上,从父代到子代,收入阶层的变化的转移概率如下

    使用矩阵的表示方式,转移概率矩阵记为

    我们发现从第7代人开始,这个分布就稳定不变了,事实上,在这个问题中,从任意初始概率分布开始都会收敛到这个上面这个稳定的结果。

    注:要求图是联通的(没有孤立点),同时不存在一个联通的子图是没有对外的出边的(就像黑洞一样)。

    这个马氏链的收敛定理非常重要,所有的 MCMC(Markov Chain Monte Carlo) 方法都是以这个定理作为理论基础的。

    对于给定的概率分布p(x),我们希望能有便捷的方式生成它对应的样本。由于马氏链能收敛到平稳分布, 于是一个很的漂亮想法是:如果我们能构造一个转移矩阵为P的马氏链,使得该马氏链的平稳分布恰好是p(x), 那么我们从任何一个初始状态x0出发沿着马氏链转移, 得到一个转移序列 x0,x1,x2,⋯xn,xn+1⋯,, 如果马氏链在第n步已经收敛了,于是我们就得到了 p(x) 的样本xn,xn+1⋯。

    这个绝妙的想法在1953年被 Metropolis想到了,为了研究粒子系统的平稳性质, Metropolis 考虑了物理学中常见的波尔兹曼分布的采样问题,首次提出了基于马氏链的蒙特卡罗方法,即Metropolis算法,并在最早的计算机上编程实现。Metropolis 算法是首个普适的采样方法,并启发了一系列 MCMC方法,所以人们把它视为随机模拟技术腾飞的起点。 Metropolis的这篇论文被收录在《统计学中的重大突破》中, Metropolis算法也被遴选为二十世纪的十个最重要的算法之一。

    7、MCMC——Metropolis-Hasting算法

    我们接下来介绍的MCMC 算法是 Metropolis 算法的一个改进变种,即常用的 Metropolis-Hastings 算法。由上一节的例子和定理我们看到了,马氏链的收敛性质主要由转移矩阵P 决定, 所以基于马氏链做采样的关键问题是如何构造转移矩阵P,使得平稳分布恰好是我们要的分布p(x)。如何能做到这一点呢?我们主要使用如下的定理。

    假设我们已经有一个转移矩阵Q(对应元素为q(i,j)), 把以上的过程整理一下,我们就得到了如下的用于采样概率分布p(x)的算法。

    8、MCMC——Gibbs Sampling算法


    平面上马氏链转移矩阵的构造

    以上算法收敛后,得到的就是概率分布p(x1,x2,⋯,xn)的样本,当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。同样的,在以上算法中,坐标轴轮换采样不是必须的,可以在坐标轴轮换中引入随机性,这时候转移矩阵 Q 中任何两个点的转移概率中就会包含坐标轴选择的概率,而在通常的 Gibbs Sampling 算法中,坐标轴轮换是一个确定性的过程,也就是在给定时刻t,在一根固定的坐标轴上转移的概率是1。

    展开全文
  • Oracle-常用调优方法

    千次阅读 2018-09-03 14:34:34
    oracle 常用调优方法 Oracle数据库应用系统的调优主要包括十个方面:(1)、优化数据库内存;(2)、在Oracle共享池中固定应用程序代码;(3)、优化数据存储;(4)、优化数据排序的技术;(5)、优化SQL语句;(6)、优化回...

    oracle 常用调优方法

    Oracle数据库应用系统的调优主要包括十个方面:
    (1)、优化数据库内存;
    (2)、在Oracle共享池中固定应用程序代码;
    (3)、优化数据存储;
    (4)、优化数据排序的技术;
    (5)、优化SQL语句;
    (6)、优化回退段;
    (7)、优化索引;
    (8)、优化磁盘I/O
    (9)、定期生成数据库对象的状态统计信息;
    (10)、优化操作系统环境。
    其实质就是降低CPU负载、改善I/O性能。

     

    1、化磁盘I/O
    数据库的作用就是实现对数据的管理和查询,所以必然存在对数据的大量读写操作,其I/O问题也往往是导致Oracle数据库性能问题的重要原因。
    1.1OracleI/O的产生
    1.2、优化OS存储
    一、在UNIT环境下,采用裸设备(Raw Device)作为Oracle数据文件的存储设备比采文件系统(File System)存储Oracle数据文件具有较高的读写效率。
    二、采用异步IOAsynchronous IO)方式。在异步IO模式下,进程发出IO请求后无需等待IO完成,可以去处理其它事情;IO请求被放入一个队列中,一旦IO完成,系统会发出信号通知进程。异步IO可以使需要大量写的Oracle进程(如DBWn进程)将IO请求队列化,以充分利用硬件的IO带宽,从而使它们能最大程度实现并行处理。确认操作系统已经设置支持AIO后,还需要设置Oracle初始化参数“DISK_ASYNCH_IO”“true”以支持异步IO
    三、磁盘负载均衡及条带化(Striping)。条带化技术就是将数据分成很多小部分并把他们分别存储到不同磁盘上的不同区域中去。这就能使多个进程同时访问数据的多个不同部分而不会造成磁盘冲突。很多操作系统、磁盘设备供应商、各种第三方软件都能做到条带化。通过条带化,DBA可以很轻松的做到IO负载均衡而无需去手工配置。
    1.3、优化IO配置
    一、利用LVMLogical Volume Manager逻辑卷管理器)软件合理的配置条带的宽度和深度。
    二、采用分离文件策略,避免磁盘热点。尽管我们在硬件和操作系统层面通过磁盘条带化实现了磁盘负载均衡,但我们依然不能避免某些数据文件成为热点文件
    分离表、索引和临时表空间的存储,即为应用系统建立单独的数据表空间、索引表空间、临时表空间。
    分离重做日志(Redo Log)文件。如果Redo Log文件的IO吞吐率高,则应将Redo Log存储在单独磁盘上,在有充裕磁盘的的情况下,应将Redo Log文件条带化分布到多个磁盘上去;
    分离归档日志文件(Archive Log)。当ORACLE数据库运行在归档模式下时,归档进程(ARCn )必然会产生大量的磁盘读写。所以应将归档日志文件条带化分布到多个磁盘上单独存储。
    1.4、优化ORACLE I/O相关的参数设置
    db_file_multiblock_read_count:用于控制一个完全连续扫描中一次 I/O 操作所读取的数据块的最大值。默认值8
    db_writer_processes
    :数据库写进程的初始数量。
    disk_asynch_io:用于控制数据文件、 控制文件和日志文件的 I/O 是否异步 。只有在平台支持磁盘异步 I/O的情况下才能更改该参数。
    log_archive_max_processes:指定归档模式下ARCH 进程的数量。

     

    2.优化数据存储

    2.1、表空间优化
    SYSTEM表空间用于存放ORACLE系统的有关信息,一般的用户建立的对象(object)不应放在SYSTEM表空间中,另外还需要注意增加SYSTEM表空间合适的大小,保证有100M左右的空闲空间。
    对于ORACLE的数据库应用系统,都应该为应用系统建立独立的ORACLE用户(scheme)、数据表空间、索引表空间、临时表空间。应将表空间及数据文件一次性设置成合适的大小,避免数据文件自动增长,造成数据段块/段的不连续,影响系统性能。
    定期检查数据库表空间的使用情况,防止表空间碎块过多,影响系统性能。通过查询视图dba_extents可获取表空间详细的使用情况。
    整理表空间碎片,回收数据表段的可用空间。
    合并表空间碎片
    alter tablespace tablespacename coalesce;
    回收数据表段的空闲空间
    alter table tablename deallocate unused;

    2.2
    、合理配置回滚段大小
    Oracle 9i以后,系统采用了透明的本地化的管理方式。默认情况下,回滚段表空间是比较小的,往往不能满足实际应用中处理大型的事务的需要,就需要为专门的大型应用或事务建立大的回滚段。

    2.3、临时表空间设计规划
    临时表空间主要用于查询操作中的distinct union order by以及create index操作及存储临时表数据等。Oracle缺省表空间为Temp,其大小为1MB,对于一个真正的中、大型应用系统是远远不够的,因此需做如下工作:
    增加Temp表空间到合适的大小,一般为300M-500M左右。
    创建用户时应为其选择专用的临时表空间。
    应该为大的应用系统建立专门的大的临时表空间,用于进行系统的月报、季报、年报统计存储临时表数据等。

    2.4、将数据文件和日志文件存储于不同磁盘上
    数据文件的写入是通过DBWR后台进程实现,日志文件的写入是通过LGWR后台进程实现,由于日志文件是连续的写入,因此无并发处理现象。而数据文件的写入相对是随机的,为避免在同一时间内DBWRLGWR的冲突,应将日志文件和数据文件放在不同的硬盘上。
    另外,在ARCHIVELOG模式时,也可能产生日志文件写磁盘与日志归档间的冲突,这种冲突的避免只能通过将日志文件分配到多个磁盘才能解决。

     

    3、优化操作系统环境

    3.1、配置操作系统合适的信号量
    Oracle在某些Unix操作系统环境下运行需要合适的操作系统信号量。应该根据Oracle版本发行的要求进行设置,譬如在SOLARIS环境下,需要以root 登录并根据Oracle安装手册的参数要求修改/etc目录的system文件。

    3.2、配置合适大小的交换区
    UNIX操作系统环境下,交换区是Oracle的一项基本的要求。可以根据Oracle的发行要求来确定。建议交换区的大小是该服务器内存的2倍以上。

    3.3、配置操作系统启用异步I/O
    目前大多数操作系统都支持异步I/O,但如果让Oracle运行在异步I/O模式下,就必须做相应的配置。譬如在HPUNIX下,需要把“/dev /async”授权给操作系统的oracle用户,并且要修改Oracle参数disk_asynch_iotrue

    3.4、将OracleSGA锁定在物理内存中。
    几乎所有的操作系统都支持虚拟内存,所以即使我们使用的内存小于物理内存,也不能避免操作系统将SGA交换到虚拟内存(SWAP),通过相应配置将Oracle SGA锁定在物理内存避免被交换到虚拟内存中,可以减少页面的换入和换出,从而提高性能。
    HP-UNIX下的配置方法:
    #/etc/setprivgrp dba MLOCK
    调整ORACLE参数:lock_sgaTRUE
    重启数据库
    AIX 5LAIX 4.3.3)下的配置方法:
    $/usr/sbin/vmo -r -o v_pinshm=1(或vmtune -s 1
    调整ORACLE参数:lock_sgaTRUE
    重启数据库

    3.5、控制内存交换操作(Paging)
    大量的内存交换操作会极大地影响系统的性能,尤其是在当数据库文件创建在文件系统上时影响更大。在这种情况下经常访问的数据,即在SGA中存在也同样在文件的缓存中存在。这种相同的数据在内存中缓存两次的情况,会降低内存的使用效率,从而使内存频繁进行交换操作,造成系统的I/O瓶颈,降低整个系统的性能。 通过将ORACLE数据文件建在裸设备上和调整系统文件缓存,可以有效降低内存交换操作。
    AIX上,可以通过vmtune命令中的MINPERM(缺省值20)和MAXPERM(缺省值80)参数来调整系统文件缓存,用以控制内存交换操作。一般将MINPERMMAXPERM分别设为5%20%甚至更小,可使内存更多地被用于OracleSGA而不是系统的文件缓存。
    vmtune -p 5 -P 20
    HP-UINX 10.X以前的版本中,分配过大的文件系统缓存,也会导致OracleSGA被交换到虚拟内存中去。在10.X以后的版本中文件系统缓存动态分配。不合理的设置dbc_min_pctdbc_max_pct也会导致无法解释的偶然或间歇性停顿出现。

     

    4.优化数据库内存

    4.1Oracle内存结构

    4.2、优化SGA(System Global Area )
    对于Oracle内存的调整设置,要根据实际情况酌情考虑,基本的原则是:
    数据缓冲区(data buffer):用于存放从数据文件读入的数据块,可以尽可能的大;
    共享池(shared_pool_size):用于保存数据字典及当前执行的SQL语句和存储过程,要适度;
    日志缓冲区(log_buffer):用于缓存用户更新的数据,不需太大。
    shared_pool_size:要大小要适度,通常设为500M左右,不应超过700M
    log_buffer :通常设为512K1M
    large_pool_size :如果不设置MTSMulti-Threaded Server),该部分内存只会在 RMAN(恢复管理) OPQ(并行查询) 中使用到,通常设置为是16M-64M
    java_pool_size : 如果在数据库里不使用java,通常设置为16M
    data buffer :在做了上面的设置后,凡可以提供给Oracle的内存,都应该给data buffer = (db_block_size * db_block_buffers)
    SGA=data buffer+shared_pool_size+log_buffer+java_pool_size+large_pool_size

    4.3
    、优化PGA (Program Global Area )
    sort_area_size
    :默认64K,通常设置为128K512K
    hash_area_size:
    不做配置,是根据2*sort_area_size计算得到
    这两个参数在非MTS下都是属于PGA(Program Global Area),不属于SGA。它是为每个session单独分配的,所以服务器上内存开销情况通常要求:OS内存+SGA+session* (sort_area_size+hash_area_size+2M)<总物理RAM

     

    展开全文
  • 1.平衡数据集的评估指标有哪些? 评估指标1:recall,Precision,F-score,其中F-score是两者的中和,一般认为F-measure越高,分类器的性能越好; Precision就是提交给用户的结果里边,究竟有多少是对的; Recall...

    1.不平衡数据集的评估指标有哪些?

    评估指标1:recall,Precision,F-score,其中F-score是两者的中和,一般认为F-measure越高,分类器的性能越好;
    Precision就是提交给用户的结果里边,究竟有多少是对的;
    Recall是一共有这么多的有用结果(包括真正的正样本和负样本),系统究竟能判定出来多少是有用的(能够检出多少?),或者反过来说,我们究竟丢了多少有用的。这两个数是成对出现,单独出现没有意义。为什么这么说?一个例子是我可以轻轻松松将recall提高到100%,那就是不管用户查询啥,我都把系统内所有的文档都给他,这样肯定没丢东西,但是用户也没法得到的好的结果。
    但是我们还是希望有一个数能够衡量系统的性能,否则系统A的precision比系统B高,但是recall却比系统B低,那么我们就不太好选了。所以综合Precision和Recall,我们得到一个F Score

    **评估指标2:mAP **
    AP衡量的是学出来的模型在每个类别上的好坏,mAP衡量的是学出的模型在所有类别上的好坏,得到AP后mAP的计算就变得很简单了,就是取所有AP的平均值。
    目标检测中的mAP是从信息检索中的mAP借鉴过来的。
    在信息检索中,Average Precision,就是对一个Query,计算其命中时的平均Precision,而mean则是在所有Query上去平均。
    回到我们目标检测中的mAP,这个概念是PASCAL VOC比赛中所明确的metric。它的意思是输出的结果是一个ranked list,里边每一个元素包含了类别、框的信息,以及confidence,这个confidence就用来排序。有了排序,就可以计算AP了,然后再针对所有分类,取一个mean,就得到了mAP。这里为何要排序呢?是因为每一个框有一个confidence,mAP作为评估指标,需要考虑confidence进来。比方说我给出一个框,说我有99%的信心这里有一个猫,结果这里没有,相比我给出一个框,说我有10%的信心这里有一个猫,结果也没有,这两个框的penalty和reward不能一样的。因为99%信心说有,结果没有,那就说明这个系统很有问题。反之,假如我给出一个框,99%的信心说有一个猫,然后真有猫,相比10%信心说有猫,结果也是有猫,这两个框也不一样。也就是越“靠谱”,reward越大。什么叫靠谱?靠谱的意思是信心足的时候,一般结果正确。所以我们根据confidence进行排序之后,就应该给排名靠前的结果,也就是confidence比较大的一些更大的权重。所以才会有ranked list。或者可以理解为,我有一个query,查询的内容是,系统中的图片里猫都在那儿?那么这个就肯定需要ranked list了。

    值得一提的是在2010年之前,VOC比赛用的AP计算方法并不是上边所述的计算方法,而是对interpolated 的那个图均匀取11个点,[0.0 0.1 0.2 … 1.0]然后求平均。后来才成上边所述的AP计算方法。

    评估指标3:接受者操作特征曲线(ROC)
    以假正率为x轴,以真正率为y轴做出的曲线。
    AUC即ROC特征曲线下面的面积,AUC越大分类器性能越好。最后说说AUC的优势,AUC的计算方法同时考虑了分类器对于正例和负例的分类能力,在样本不平衡的情况下,依然能够对分类器作出合理的评价。例如在反欺诈场景,设非欺诈类样本为正例,负例占比很少(假设0.1%),如果使用准确率评估,把所有的样本预测为正例便可以获得99.9%的准确率。但是如果使用AUC,把所有样本预测为正例,TPRate和FPRate同时为1,AUC仅为0.5,成功规避了样本不均匀带来的问题。

    2.不平衡数据集的常用的处理方法?

    (1)增强数据集,获取更多的数据(2)重新采样,针对小类数据进行过采样,大类数据进行欠采样(3)人造数据,进行属性随机值采用(4)改变算法,增大小类数据的权值,减小大类数据的权值。或者做异常值处理将小类数据作为异常点,从而转化为异常检测问题,将最后将是一个大类分类器。以两类问题为例 , 假设正类是稀有类 , 并具有 更高的错分代价, 则分类器在训练时, 会对错分正类样本做更大的惩罚 , 迫使最终分类器对正类样本有更高的识别率 .如Metacost和Adacost等算法。

    展开全文
  • 处理平衡数据的常用采样方法

    千次阅读 2018-01-06 10:51:51
    介绍在数据挖掘中,经常会存在平衡数据的分类问题,比如在异常监控预测中,由于异常就大多数情况下都不会出现,因此想要达到良好的识别效果普通的分类算法还远远不够,这里介绍几种处理平衡数据的常用方法及对比...
  • 常用概率分布函数及随机特征

    万次阅读 2018-02-08 20:28:52
    常见分布的随机特征离散随机变量分布伯努利分布(二点分布)伯努利分布亦称“零一分布”、“两点分布”。称随机变量X有伯努利分布, 参数为p(0&lt;p&lt;1),如果它分别以概率p和1-p取1和0为值。EX= p,DX=p(1-p...
  • js数组常用方法

    万次阅读 多人点赞 2018-12-26 15:04:25
    数组转字符串,方法只接收一个参数:即默认为逗号分隔符()。 &lt;script&gt; var arr=[1,2,3,4]; console.log(arr.join()); //1,2,3,4 console.log(arr.join(":")); //1:2:3:4 console....
  • Java 8 Stream常用方法学习

    万次阅读 多人点赞 2021-01-21 09:21:11
    Stream Stream流是 Java8 API 新增的一个处理集合的关键抽象概念,是一个来自数据源的元素队列并支持聚合操作。以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据... Java中的Stream并会存储元
  • 包括随机裁剪、翻转、直方图均衡化、gamma变换、滤波和随机噪声及其python实现。图像数据增强广泛用于深度学习的训练,对模型的性能提升有很大的帮助,这里列出了图像数据增强的几种方式; ...
  • Unity Dotween常用方法详解

    千次阅读 多人点赞 2020-03-03 15:50:38
    Dotween是unity里非常常用的插件,下面我就针对一些相对常用方法,做下总结: 一、Unity常用组件拓展方法 (1) Transform拓展方法 1)Position 1)改变世界坐标 移动方法,第一个参数是要移动到的目标点,...
  • 常用数据科学方法总结梳理笔记

    千次阅读 2019-05-10 16:27:06
    常用数据科学方法 【未经允许,不得转载】 ...
  • 结果为0-1间的一个随机数(包括0,不包括1) 。 2.Math.round(num); 四舍五入后的整数。 3.Math.ceil(n); 向上取整。 4.Math.floor(num); 仅保留整数部分(向下取整)。 用Math.floor(Math.random()*10);时,可...
  • 常用的哈希函数构造方法
  • 随机变量的数字特征 第一部分 数学期望 一、随机变量的数学期望 定义 1 设离散型随机变量的分布律为 若,则称 为随机变量的数学期望或均值。   定义 2 设连续型随机变量的概率密度为,若,则称 为随机变量的...
  • 本文是对参考资料中多篇关于sampling的内容进行总结+搬运,方便以后自己翻阅。其实参考资料中的资料写的比我好,大家可以看一下!好东西多分享!...随机模拟也可以叫做蒙特卡罗模拟(Monte Carlo Sim
  • 视频图像去模糊常用处理方法

    千次阅读 2019-03-26 13:27:47
    视频图像去模糊常用处理方法 随着“平安城市”的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行、商场、车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的...
  • 认识黑客常用的入侵方法

    千次阅读 2016-09-24 12:08:21
    黑客常用的入侵方法有数据驱动攻击、系统文件非法利用、伪造信息攻击 以及远端操纵等,下面就简单介绍这些入侵方法。 数据驱动攻击 数据驱动攻击是指黑客向目标计算机发送或复制的表面上看来无害的...
  • 随机采样和随机模拟

    万次阅读 2016-01-31 19:26:41
    模拟方法:是一种基于“随机数”的计算方法,基于数值采样的近似推断方法,也被称为蒙特卡罗( MonteCarlo )方法随机模拟方法。   通常均匀分布Uniform(0,1) 的样本,即我们熟悉的类rand()函数,可以由线性同余...
  • JavaScript数组中的22个常用方法

    万次阅读 2016-08-06 21:51:19
    数组总共有22种方法,本文将其分为对象继承方法、数组转换方法、栈和队列方法、数组排序方法、数组拼接方法、创建子数组方法、数组删改方法、数组位置方法、数组归并方法和数组迭代方法共10类来进行详细介绍 ...
  • 几种常用信号平滑去噪的方法(附Matlab代码)

    万次阅读 多人点赞 2020-07-31 20:44:36
    几种常用信号平滑去噪的方法(附Matlab代码)1 滑动平均法1.0 移动平均法的方法原理1.1 matlab内自带函数实现移动平均法1.2 利用卷积函数conv()实现移动平均法1.3 利用filter滤波函数实现移动平均法1.4 移动平均的...
  • 图像修复常用方法

    千次阅读 2016-12-10 11:52:42
    有关曲线、区域和三维表面等特征的提取的研究工作分为正则化方法,松弛标记法,鲁棒性方法,水平集方法,聚类方法,基于结构显著性的方法,基于视觉竞争合作机制的组织方法和用于图像修复的一些方法等。
  • 像素级图像融合常用方法

    万次阅读 多人点赞 2019-07-18 11:22:42
    像素级图像融合常用方法: 根据对图像信息处理运用方式不同,可将图像融合分为三个层次上的研究,即像素级,特征级和决策级。其中像素级融合位于最低层,可以看作是对信息仅作特征提取并直接使用。也正是得益于其对...
  • EEG脑电信号常用处理方法

    千次阅读 多人点赞 2020-01-18 11:42:36
    机(SVM)、基于随机森林和 Boosting 的集成技术。 通过对相关文献的研究,信号变换和分解的方法 多样,一般在信号处理后选取能量、熵等作为特征,但 变换方法及提取的特征单一化,无法多方面地表示脑 电信号,...
  • 时间序列预测的8种常用方法简介

    千次阅读 2020-12-08 22:01:17
    时间序列预测8种常用方法简介,包括朴素预测法、简单平均法、移动平均法、简单指数平滑法、霍尔特(Holt)线性趋势法、Holt-Winter方法、AMRIA。
  • 空间数据挖掘常用方法

    万次阅读 2014-12-10 21:55:45
    问题1:空间数据挖掘有哪些常用方法,举例说明一种方法的原理及应用. 答:空间数据挖掘的常用方法有:统计法,聚类方法,关联规则发掘方法,Rough集方法,神经网络方法,云理论,证据理论,模糊集理论,遗传算法...
  • 常用的抽样方法

    千次阅读 2015-12-09 08:39:25
    转载自:... 1.非概率抽样(Non-probability sampling)  又称非随机抽样,指根据一定主观标准抽取样本,令总体中每个个体的被抽取不是依据其本身的机会,而是完全决定于调研者的意愿。  其特点
  • 常用的降维方法

    千次阅读 2018-09-17 15:19:10
    什么是降维? 大数据时代,随着数据的...举个例子,描述一个人的各项特征里包括身高体重,在我们想要解释这个人的身体状况或者体质时,就可以通过身高体重来计算得到这个人的体质指数,那么二维的身高体重转换成...
  • 常用最优化方法

    千次阅读 2018-05-18 14:14:15
    熟悉机器学习的童鞋都知道,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解无约束最优化问题。实现简单,coding方便,是训练模型的必备利器之一。 2. 几个数学概念 1)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 204,156
精华内容 81,662
关键字:

常用的随机方法不包括