• 基于内存共享的并行排序算法慢谈(中)


    题目再现:请用Python多线程对一个4G以上的文件, 进行外排序,尽量优化性能。假设系统内核数为8,Mem=512MB,关键字是字符串

    5.外排序与内排序

    5.1.归并外排序分析

    说到外排序仿佛用的都是归并排序的思想,具体我就不多说了,见园里的:

    http://www.cnblogs.com/this-543273659/archive/2011/07/30/2122083.html

    整个流程大致如下:

    A:将N个数据分成M个块,在内存中分别对这M个块各自排完序(快速排序)并输出,产生M个子文件

    读入一次N,输出一次N,空间复杂度N/M,时间复杂度N+O(Nlog(N/M))

    B:选出M个di1,i表示来自第i个文件,1表示它是第i个文件里第i小的。

    M个文件N个数据都要读入并输出,即IO为2N,空间复杂度M

    C:对这M个数据排序(插入排序),排序后选出第1个假设为dj1,将其输出到最终文件,

     并从第j个子文件里再取一个第2小的,凑成M个数据。依次类推直到M个文件中数据被取完。

     时间复杂度O(M2)+(N-M)O(M)

    总共IO次数4N,空间复杂度max(M,N/M),时间复杂度S=O(4N)+O(Nlog(N/M))+O(M2)+(N-M)O(M)

    5.1.1.每个块里选一个是不是最好的

    假设从排序后的各个文件里选出K>1个,共有MK个数据

    空间复杂度max(MK,N/M),时间复杂度S'=O(4N)+O(Nlog(N/M))+O(MK)2+(N-MK)/KO(MK)

    S-S'=O(M2)+(N-M)O(M)-O(MK)2-(N-MK)/KO(MK)

    这里就不太好分析了,要具体情况具体分析了,不过一般情况下M<=Mem<<N

    S-S'=O(M2)-O(MK)2+a(N-M)M-a(N-MK)M=O(M2)-O(MK)2+aM2(K-1)

    估摸着不会产生太大的影响,有兴趣的可以在实验中观察看看,这里就不多说了。

    5.1.2.M取多少是最好的

    N/Mem<=M<=Mem,要是N/Mem=Mem就完美了。令PS为S中M可影响的近似部分

    PS=aNlog(N/M)+bNM 求导得到使得PS最小的M取值竟然是M=a/b,神那,这叫我情何以堪。

    昨天跟老大讨论的时候,老大说外排序的主要性能瓶颈就是IO,要减少IO次数,还要使用预取思想,提前把数据导入到内存。

    因为IO集中起来连续读要快些。我问他这个M取多少最好,他的意思是尽量使得N/M接近Mem,最大限度的利用内存。

    并且在归并阶段,也尽量的多导入数据。

    5.2.其它外排序分析

    除了归并外,还有没有更好的,各位大神一起发发力,小弟快不行了。

    我想可不可以用快速排序做外排序

    A随机选一个数据,扫描文件,将其分成两个子文件,这个临界数据可以先放到内存里。前提是Mem>>N/Mem

    B对子文件进行递归操作,直到内存能够容得下分出来的子文件,此时把这个子文件调到内存里做内排序

    理想状态下,假设每次快排都能平均分,则

    IO代价为O(log2(N/Mem)N),排序代价为N/MemO(MemlogMem)

    K=O(log2(N/Mem)N)+N/MemO(MemlogMem)

    令N=8G,Mem=512M,M=16,N/Mem=16则

    S=O(4N)+O(Nlog(N/16))+16*16+(N-16)16

    K=O(4N)+O(Nlog(N/16))

    也就是在磁盘IO相等的情况下,快速外排序还好点。

    但是当N/Mem>16,比如N/Mem=32,磁盘IO次数上升到O(5N),这个就不好说了。

    如果不是理想状态,IO的次数就更多了,同样有兴趣的可以做实验看看。

    本文还是以归并外排序作为解决策略。

    5.3内排序分析

    (上)已经提到内排序将使用并行化的快速排序,关于内排序我以前曾分析过

    在某些情况下 高级排序算法不一定比低级排序算法好 我这个就不重复说了

  • 相关阅读:
    body中的font属性和color属性
    div 的position属性
    border属性
    html header标签
    关于web.config中<customErrors>节点说明
    STL 小白学习(1) 初步认识
    sin n次方 x 的降幂公式
    查找结构体数组中的人名是否匹配
    将结构体数组中内容以文件形式的导出
    python 小白学习(1)
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/2563621.html
Copyright © 2020-2023  润新知