我最近在处理一个程序 要从数据库读取4万多条数据 然后每两条数据的不同属性根据不同权重算出一个值总共就需要进行8亿次计算 最后对这8亿个数据排序。我觉得这个程序运行时间可能会很长(是吗???)我希望程序的时间能尽量缩小,有什么编程的方法可以借鉴吗需要用到并行?多线程?还是分布式框架(如hadoop?)我的数据条目很大,但是数据量比较小,一共才200多兆,我觉得hadoop好像主要是针对大数据量的 而不是大量计算的。但是我的计算的方法很简单,都是同一种算法。用多线程的话怎么设置线程分流呢?新手~~四处看来看去 有点焦头烂额啦 希望大侠们解救~~

解决方案 »

  1.   

    我觉得应该计算用多线程,读取用单线程
    因为读取是IO密集型,主要时间花在等待磁盘上,cpu时间很少,开多个线程无意义
    而计算则主要花在cpu上,这时如果能把数据分成几部分让多个cpu分开计算则能省时间
      

  2.   

    这个问题很简单,最好的解决方案就是采用数据库架构,不要考虑用前台程序实现,扩展性和维护性很差,这么大的数据量计算本来就是后台数据库的工作。
    [/Quote]
    采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
      

  3.   

    这个问题很简单,最好的解决方案就是采用数据库架构,不要考虑用前台程序实现,扩展性和维护性很差,这么大的数据量计算本来就是后台数据库的工作。
    [/Quote]采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
      

  4.   

    >>采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
    对,如果oracle用物化视图,sqlserver 存储物理表。
      

  5.   

    在数据库上面下功夫吧,建几个视图,写存储过程具体看业务
    多线程计算不见得比单线程快,还得看cpu
      

  6.   

    LS说用数据库的不知道有没有真正考虑过。不要神化数据库,假设在有索引时,插入一千万数据是1分钟(实际我猜要10分钟),那么8亿数据要 8 * 100分钟,再考虑到8亿数据的索引,那么索引的大小至少是8 * 1000000000 * 4(int) = 30G,通常的机器没有这么大的内存,那么必然会导致频繁的换页,所以插入效率大大下降。
    综合考虑,光是插入数据起码要一天。如果是单机,考虑到生成数据,再用外部多路排序,估计起码也要好几个小时。
    如果是用mpi,编程估计会比较复杂。
    按hadoop的资料,把生成数据的任务分配到各个机器上,再用mapreduce排序,应该可行。声明,本人上述技术也只是了解,随便说说的。其实我觉得4万的数据,要产生8亿的数据,这个也太恐怖了,我觉得应该从这里优化。比如合并类似的数据,只做一些近似分析。
    比如A的数据是100,120,B的数据也是100,120,完全可以把这两者合并起来,这样可以大大减少生成的数据量。