Java 问题请教,优化双重 for 循环执行效率 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cyzc
V2EX    问与答

Java 问题请教,优化双重 for 循环执行效率

  •  
  •   Cyzc 2021-04-05 21:08:02 +08:00 2281 次点击
    这是一个创建于 1649 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有两个集合,取集合中对象的经纬度,计算两者之间的距离。 之前写的是双重 for 循环遍历,然后取两对象的经纬度计算距离然后落库。但是现在数据量太大了 一个集合是 20000+,另一个集合是 50000+,这样要计算 10e 次,请问有啥优化方法吗?

    13 条回复    2021-04-06 16:18:11 +08:00
    tairan2006
        1
    tairan2006  
       2021-04-05 21:15:17 +08:00 via Android
    并行算啊……map reduce 不都老生常谈了
    godlovesxcjtest
        2
    godlovesxcjtest  
       2021-04-05 21:23:41 +08:00
    java8 开始的 stream 可以用一下:parallelStream 可以并行计算,算是一种优化的思路
    Cyzc
        3
    Cyzc  
    OP
       2021-04-05 22:00:39 +08:00
    @godlovesxcjtest
    谢谢老哥,感觉 parallelStream 效率还是不够高,感谢
    Cyzc
        4
    Cyzc  
    OP
       2021-04-05 22:01:17 +08:00
    @tairan2006
    没接触过 mapreduce.....
    jmc891205
        5
    jmc891205  
       2021-04-05 22:07:40 +08:00
    这两个集合每次都是全新的?还是说其中有一些数据是老的不变的?
    直觉上你应该从系统设计上去考虑如何避免重复的计算
    Cyzc
        6
    Cyzc  
    OP
       2021-04-05 22:21:07 +08:00
    @jmc891205
    老哥,没有重复数据,相当于就是计算 10e 次。。。
    yeqizhang
        7
    yeqizhang  
       2021-04-05 22:48:59 +08:00 via Android
    落库啥意思? 10 亿全存了?这需求是什么啊?
    akira
        8
    akira  
       2021-04-06 02:00:30 +08:00
    先弄清楚你需要的结果是什么,是 10e 个结果么,应该不是。
    不是的话 那就要根据具体情况具体分析了呀
    是要最近的 2 个点的距离,还是最远的,还是什
    zm8m93Q1e5otOC69
        9
    zm8m93Q1e5otOC69  
       2021-04-06 08:26:04 +08:00
    有顺序要求吗?没有就起多线程算
    zqjnew
        10
    zqjnew  
       2021-04-06 08:59:39 +08:00
    1 、 确定计算精度, 将经纬度合为 一大范围后的 值
    2 、并行计算, 讲集合的数据均分成 CPU 数量个线程处理
    3 、用 CUDA 或 GPU 进行计算
    xxxyh
        11
    xxxyh  
       2021-04-06 09:51:52 +08:00
    不清楚需求的背景,猜测一下是想一次计算所有结果存下来以后直接查。如果是这种情况的话,反正只跑一次,就不用太在意计算的过程,反正 10 亿次的计算是少不了的,落库比较慢,至少比计算慢得多。基于这个前提,不如花时间想想后面的查询怎么优化
    dqzcwxb
        12
    dqzcwxb  
       2021-04-06 11:23:06 +08:00
    动态规划+并行
    cubecube
        13
    cubecube  
       2021-04-06 16:18:11 +08:00
    你这个需求应该不完整,经度和纬度的集合不可能无脑组合都是合理的?首先要找出方法确定在第一个集合经度已知时,第二个集合的取值范围
    不然怎么优化都是暴力算。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     884 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:44 PVG 04:44 LAX 13:44 JFK 16:44
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86