f***t 发帖数: 2247 | 1 还是使用Fortran,没法子,各位大神就多担待一下吧。
有一个数组A(n),挑选出大于b,并且小于c的元素。
do i = 1, n
if ((A(i).gt.b).and.(A(i).lt.c)) then
.......
.......
.......
Else
End if
End do
如果使用上边的方式,是可以出结果的,问题是计算时间太长了。(因为数组实在是太
大了),估计一个月能跑出一个样品数据就不错了。各位大神有没有什么更好的办法?
只求缩短计算时间。
先谢谢各位大神了! |
c******n 发帖数: 891 | 2 要求提供数据的人,数组中不能有大于b小于c的元素。
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
H********g 发帖数: 43926 | 3 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑LOL
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
H********g 发帖数: 43926 | 4 fortran比大小怎么可能慢 估计fortran程序本身根汇编程序的语句数量一样LOL
你不会是在每个循环里都重新把计算又做了一遍吧LOL
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
s*l 发帖数: 9421 | |
B********u 发帖数: 1 | 6 因为lz没你这么傻
少说两句别丢人了
: 为嘛不先sort再选?
【在 s*l 的大作中提到】 : 为嘛不先sort再选?
|
l*******s 发帖数: 7316 | 7 最快的sort也不会比lz的code更快。
【在 s*l 的大作中提到】 : 为嘛不先sort再选?
|
G******U 发帖数: 4211 | 8 能想象到更快的只能是内存地址指针。每个数组元素放到
一个指定的有固定位数的地址。所有元素全都放好。用汇
编直接从每个最高位开始跑一遍,然后下一位,直到c的
非零最高位。
想象而已。我绝不会去做。
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
s*l 发帖数: 9421 | 9 属实 尼玛闹笑话了L0L
: 最快的sort也不会比lz的code更快。
【在 l*******s 的大作中提到】 : 最快的sort也不会比lz的code更快。
|
s*l 发帖数: 9421 | 10 你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到excel
上跑,多开几台电脑,用excel的lookup功能。
: 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑
LOL
【在 H********g 的大作中提到】 : fortran比大小怎么可能慢 估计fortran程序本身根汇编程序的语句数量一样LOL : 你不会是在每个循环里都重新把计算又做了一遍吧LOL
|
H********g 发帖数: 43926 | 11 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
excel
【在 s*l 的大作中提到】 : 你这个算法可行,尼玛他那个估计数组比内存都大,如果领导不介意也可以放到excel : 上跑,多开几台电脑,用excel的lookup功能。 : : : 并行 最简单的办法 手动并行 把数据切割开 放到100个电脑上跑 : LOL :
|
B********u 发帖数: 1 | 12 看起来数据没有前后依赖关系
就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分
配到不同机器去算
【在 H********g 的大作中提到】 : 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL : 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL : : excel
|
s*l 发帖数: 9421 | 13 我也脚着楼主一定隐瞒了啥,数组到底有多大也没说清楚,几个鸡还是几个败?LoL
: 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL
: 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL
: excel
【在 H********g 的大作中提到】 : 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL : 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL : : excel
|
z***i 发帖数: 8285 | 14 AWK !! 上古神器啊
几月前贴过的居然被钻风删了
这样告诉你,7800个文件,每个文件几万行数据
一个小时处理完了
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
f***t 发帖数: 2247 | 15 您的意思是散列搜索,先搞个hash表格,对吗?为什么你绝不会这么做?请指点迷津,
多谢。
【在 G******U 的大作中提到】 : 能想象到更快的只能是内存地址指针。每个数组元素放到 : 一个指定的有固定位数的地址。所有元素全都放好。用汇 : 编直接从每个最高位开始跑一遍,然后下一位,直到c的 : 非零最高位。 : 想象而已。我绝不会去做。
|
f***t 发帖数: 2247 | 16 恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具
体结构和大小如下:
do i = 1, N1 !大小在10^9数量级
b(i) = ......
c(i) = ......
do j = 1, N2 !大小在10^7数量级
if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
.......
.......
else
endif
enddo
enddo
其中,N1是整个流场模型的位置模拟取样点,大小在10^9数量级。
N2 (或者A(j))是模拟另外一个控制条件,大小在10^7数量级。
咋办?有啥好办法?
先多谢各位大神指点迷津!
【在 s*l 的大作中提到】 : 我也脚着楼主一定隐瞒了啥,数组到底有多大也没说清楚,几个鸡还是几个败?LoL : : : 看起来比一般买得起的硬盘还大, 如果光是比大小的话LOL : : 估计是什么地方把效率弄低了 LOL 问题没问到点子上LOL : : excel :
|
f***t 发帖数: 2247 | 17 高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。
具体结构和大小如下:
do i = 1, N1 !大小在10^9数量级
b(i) = ......
c(i) = ......
do j = 1, N2 !大小在10^7数量级
if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then
.......
.......
else
endif
enddo
enddo
其中,N1是整个流场模型的位置模拟取样点,大小在10^9数量级。
N2 (或者A(j))是模拟另外一个控制条件,大小在10^7数量级。
咋办?有啥好办法?
先多谢各位大神指点迷津!
【在 B********u 的大作中提到】 : 看起来数据没有前后依赖关系 : 就你那办法靠谱了,hash一下(或者直接用下表当hash值,然后根据hash值求模平均分 : 配到不同机器去算
|
s*l 发帖数: 9421 | 18 尼玛这是N平方,怪不得,否则linear有啥好算得,你那个本身就是最优算法。等我忙
完回头和你算
【在 f***t 的大作中提到】 : 恩,你说的没错,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。具 : 体结构和大小如下: : do i = 1, N1 !大小在10^9数量级 : b(i) = ...... : c(i) = ...... : do j = 1, N2 !大小在10^7数量级 : if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then : ....... : ....... : else
|
f********m 发帖数: 1 | 19 第一层10^9,第二层10^7,
10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要
快多了 |
s*l 发帖数: 9421 | 20 一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
s*l 发帖数: 9421 | 21
【在 s*l 的大作中提到】 : 一图胜千言,请把你的N1和N2标出,tt uu 各行和各列的size也最好能标出。
|
l*******s 发帖数: 7316 | 22 +1
这种情况下,先对A做个quicksort,就能省时间了。
数值比较的cost 从10^9 x 10^7 减少到 (10^9 + 10^7 )x log (10^7).
但其他的在if else endif 里面的cost 还是10^9 x 10^7。
不知道if else endif 里面是不是需要针对每一组b,c 和a 重复。
如果是的,可以说优化没有意义。应为总工作量是10^9 x 10^7, 不可能减少。
如果只是统计有多少 a(j) 是在b(i)和c(i)之间, 则可以省掉a(j)循环。
用凉粉发之间找出sort后的第1个和最后一个在b(i)和c(i)之间的a(j)。
【在 f********m 的大作中提到】 : 第一层10^9,第二层10^7, : 10^7个数做个排序能用多少时间?完全能在内存里做啊。后面就是二分查找比O(N)要 : 快多了
|
d********f 发帖数: 43471 | 23 你在搞笑么,你就是有1TB的数据也就1小时就搞定了,难道你有PB级别的数据
【在 f***t 的大作中提到】 : 还是使用Fortran,没法子,各位大神就多担待一下吧。 : 有一个数组A(n),挑选出大于b,并且小于c的元素。 : do i = 1, n : if ((A(i).gt.b).and.(A(i).lt.c)) then : ....... : ....... : ....... : Else : End if : End do
|
d********f 发帖数: 43471 | 24 。。。。。
【在 f***t 的大作中提到】 : 高手,麻烦看一下,这是一个两层循环结构。我担心问题表达不清楚,就简化处理了。 : 具体结构和大小如下: : do i = 1, N1 !大小在10^9数量级 : b(i) = ...... : c(i) = ...... : do j = 1, N2 !大小在10^7数量级 : if ((A(j).gt.b(i)).and.(A(j).lt.c(i))) then : ....... : ....... : else
|