如何使程序用时更短?

fallinsky 2011-11-01 08:49:44
我最近在处理一个程序 要从数据库读取4万多条数据

然后每两条数据的不同属性根据不同权重算出一个值

总共就需要进行8亿次计算

最后对这8亿个数据排序。我觉得这个程序运行时间可能会很长(是吗???)

我希望程序的时间能尽量缩小,有什么编程的方法可以借鉴吗

需要用到并行?多线程?还是分布式框架(如hadoop?)

我的数据条目很大,但是数据量比较小,一共才200多兆,我觉得hadoop好像主要是针对大数据量的 而不是大量计算的。

但是我的计算的方法很简单,都是同一种算法。用多线程的话怎么设置线程分流呢?

新手~~四处看来看去 有点焦头烂额啦 希望大侠们解救~~
...全文
116 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
横云断岭 2011-11-03
  • 打赏
  • 举报
回复
LS说用数据库的不知道有没有真正考虑过。

不要神化数据库,假设在有索引时,插入一千万数据是1分钟(实际我猜要10分钟),那么8亿数据要 8 * 100分钟,再考虑到8亿数据的索引,那么索引的大小至少是8 * 1000000000 * 4(int) = 30G,通常的机器没有这么大的内存,那么必然会导致频繁的换页,所以插入效率大大下降。
综合考虑,光是插入数据起码要一天。

如果是单机,考虑到生成数据,再用外部多路排序,估计起码也要好几个小时。
如果是用mpi,编程估计会比较复杂。
按hadoop的资料,把生成数据的任务分配到各个机器上,再用mapreduce排序,应该可行。

声明,本人上述技术也只是了解,随便说说的。

其实我觉得4万的数据,要产生8亿的数据,这个也太恐怖了,我觉得应该从这里优化。比如合并类似的数据,只做一些近似分析。
比如A的数据是100,120,B的数据也是100,120,完全可以把这两者合并起来,这样可以大大减少生成的数据量。
用户 昵称 2011-11-03
  • 打赏
  • 举报
回复
计算值,比较容易吧,多线程,分成10个,每个计算1/10。

计算完了再排序,这个俺觉得确实是数据库方便。
龙行天下之Sky 2011-11-03
  • 打赏
  • 举报
回复
多线程处理还是可以的
sevancheng 2011-11-02
  • 打赏
  • 举报
回复
在数据库上面下功夫吧,建几个视图,写存储过程。。。具体看业务
多线程计算不见得比单线程快,还得看cpu
fallinsky 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gameslq 的回复:]
[Quote=引用 4 楼 fallinsky 的回复:]
大家意见都不一致啊
[/Quote]
这个问题很简单,最好的解决方案就是采用数据库架构,不要考虑用前台程序实现,扩展性和维护性很差,这么大的数据量计算本来就是后台数据库的工作。
[/Quote]

采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
fallinsky 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gameslq 的回复:]

[Quote=引用 4 楼 fallinsky 的回复:]
大家意见都不一致啊
[/Quote]
这个问题很简单,最好的解决方案就是采用数据库架构,不要考虑用前台程序实现,扩展性和维护性很差,这么大的数据量计算本来就是后台数据库的工作。
[/Quote]
采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
l460602540 2011-11-02
  • 打赏
  • 举报
回复
个人觉得还是多线程计算,单线程读取。
gameslq 2011-11-02
  • 打赏
  • 举报
回复
>>采用数据库架构?你的意思是直接在数据库里执行吗?用查询语言或存储过程直接做?然后维护一个表来存储这8亿个计算结果吗?
对,如果oracle用物化视图,sqlserver 存储物理表。
gameslq 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fallinsky 的回复:]
大家意见都不一致啊
[/Quote]
这个问题很简单,最好的解决方案就是采用数据库架构,不要考虑用前台程序实现,扩展性和维护性很差,这么大的数据量计算本来就是后台数据库的工作。
fallinsky 2011-11-01
  • 打赏
  • 举报
回复
大家意见都不一致啊
oyljerry 2011-11-01
  • 打赏
  • 举报
回复
把数据分块,MP,多线程都可以用来计算各个分块数据,然后再综合
Lactoferrin 2011-11-01
  • 打赏
  • 举报
回复
我觉得应该计算用多线程,读取用单线程
因为读取是IO密集型,主要时间花在等待磁盘上,cpu时间很少,开多个线程无意义
而计算则主要花在cpu上,这时如果能把数据分成几部分让多个cpu分开计算则能省时间
羽飞 2011-11-01
  • 打赏
  • 举报
回复
我只能想到多线程
读取数据比较耗时,可以开多个线程来读数据
计算数据应该比较快,计算可以开一个线程
排序的话,感觉是直接把计算好的数据放到排序的数据结构中,也开一个线程

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧