将264万次数据的比较运算,运行时间从2.5小时降低到3分钟(R实现)

     问题描述:有一个数据集合(该数据集合目前还在飞速增长中,计算复杂度也远高于O(N),如果这种简单的计算都搞不定,其他的就别搞了),2500*36的矩阵,需要任意两列之间进行两两的对比,计算由任意两行组成的向量之间差的方差,总共计算次数(2301+1)*2301/2=2648451,环境:i5,16g,256SSD,R的计算基于内存,机器内存也非常充足,按理说,不管怎样,都应该很快

     解决方案简单粗暴:读出矩阵的每一行,和接下来的所有行进行对比,计算方差,将对比结果(也是一个矩阵,2648451*3维的矩阵)写入结果文件。但解决方式不同就造成了结果的巨大差异。

    方案一:将每次读取和对比的结果写入Mysql(本机),4s计算出一轮(每轮涉及近(2300+1)/2 次对比)结果,每次间隔时间倒是稳定,但2301*4/60/60/=2.5小时,不可接受!

    方案二:将所有计算得到的数据迭代式的临时保存在一个向量中(vector <- c(vector,...)),最后由as.matrix将向量转化为矩阵,开始非常快,但到了100以后,随着向量增长,R的向量建立方式和我想象的不一样,速度是越来越慢,但总体还是快于存入数据库的,以100轮6分钟计算,不考虑的增量的情况下,2.3小时(实在忍不了,不等了)。

    其时间增长曲线如下图所示(为保持严谨性,重做了下实验,并记录了数据):   

                               

       方案三:减少数据缓存空间,计算出结果后,只缓存一个循环的数据,即(2300,2299,2298,...,1)的等差数列,立即增量写入结果文件,结果总体时间降到总共3.05188分钟(看来R的内存使用方式也没这么高效嘛)

     结论,还是不能任性,还是得设计下程序结构。另外,为啥要用R跟数据库交互,因为数据是CSV文件,在R下两行代码就搞定了,要用JAVA写,20行也不一定搞的定,还不能画图。

    顺便吐槽一下,R真是统计学家做出来的东西!!

                                    

posted on 2015-11-30 20:33  helloever  阅读(410)  评论(0)    收藏  举报

导航