百度笔试题7.1

题目一:

http://topic.csdn.net/u/20070513/15/8433AAB7-5425-4BC0-ABA5-1038BBBEFD18.html

 

有这么一个程序,每天要接受5千万个数据包(数据包的格式如下),数据被顺存储在一些文件中。程序每天定点对数据进行处理。对数据分组并按从大到小的顺序排序。已知一个文件的最大大小为2G,一个进程的最大内存大小为2G。现在只允许用一个CPU数量为4个,内存为16G 的服务器完成整个过程,使得时间尽可能的短。

您的任务:尽可能的描述数据结构(或文件结构),写出尽可能多的伪代码,流程图。

Ps:

1.    程序随机访问外存耗费的时间是顺序访问的10倍。

2.    50G,5千万的数据包.顺序访问是20分,随机访问大概是4个小时。

 

tydef   struct  

{

  int  group;

  int  val;

  char   data[1024];//1k的数据域

}   DataType;

 

Answer1

1、先用四个线程(因为是4cpu)对所有文件(即50G/2G   =   25个文件)单独排序,得到25个数组,组内按val排序的有序文件。

2、同样用4个线程,在25个有序文件的基础上,采用归并排序,得到13对有序排列的文件(除了第25个文件外,其余相邻两个文件组成一对

3、按照第二条的方法,递归,最后即可得到要求的结果。

 

Answer2

1:应该是主要考归并排序和分组排序的问题

 

2:我们这样利用内存,2G内存1G(应多于1G一点大约多10兆)用来存数据,也就是说一次读入一百万个数据包,剩下的1G留下给进程堆栈、程序地址段空间、和临时内存变量用。

 

3:一个数据包大小约为1024+8B大小,5千万个数据包也就相当于50G+50兆左右,我们建立51个文件,每个文件前1000字节为控制信息,剩下的1G(可能会多10兆)用于存数据。

 

4:多线程处理数据包,启用4个进程(每个进程启动一个内核级线程,这是因为***每个内核级线程可以使用一个Cpu处理***

 

5:建立共享内存临界区,每个进程在完成本次数据包处理任务后,读取临界区(包处理完的个数   HaveDeal

      Lock(s_HaveDeal)

      UNIT   curDealBegin=HaveDeal;

      UnLock(s_HaveDeal)

6:更新临界区

      UNIT   curDealEnd=CurDealBegin+1024*1024*1024(1G)+10*1024*1024(10兆);

      Lock(s_HaveDeal)

      UNIT   HaveDeal=curDealBegin;

      UnLock(s_HaveDeal)

7:每次数据顺序读入内存,然后分组排序,根据组数可以将1G内存分散开,比如分4组,那么建立4个数组T1,T2,T3,T4,内存中可分组排序,组内可简单的采用顺序排序方法(或其他好的排序方法),时间复杂读最大为O(2)

 

8:将分组排序好的内存数据写到文件,文件的前1000字节控制信息可这样设计。

      总组数  

      总包数  

      1   包数

      1   开始索引

      1   结束索引

        2   包数

      2   最小值

      2   最大值

。。。。。

9:专门设一个排序文件SORTFILE,这个文件大小约为:组信息+包信息(10*5*1000*1000 <200兆,文件里记录如下信息:    

      总组数

      1   开始索引

      2   开始索引

      。。。。。。

      1   所在文件号,索引,值(占10字节)

      2   所在文件号,索引,值

    。。。。。。

10:一次顺序读取完成后,进行第二个任务,将SORTFILE文件总的记录信息加载到内存,

在内存总对包进行归并排序(具体可见任何一本数据结构书中的归并算法),再重新建立262G的文件,当算法中记录移动的时候,文件相应索引中的数据记录归并到新的2G的文件中,则任务完成。

 

Answer3:

16G内存,那至少得开8个进程,才能最大利用内存;

因为‘程序随机访问外存耗费的时间是顺序访问的10倍’,所以要尽量用顺序访问;第一次顺序访问所有记录,把groupval提取出来,同时要记录位置信息,然后根据group分组,每组对val排序。

16G内存,如果能有12.5G用于保存数据,则再顺序访问4次,就可以把所有数据按排好的顺序写入文件。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cyf31

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值