在一个P2P网络中,有很多用户,他们中至少有一个人拥有一个完整文件,其他用户也许正在下载该文件或已经下载完或不下载该文件。 假设某一时间点,m个用户有文件A,(1 <=m),有n个用户正在下载,这n个用户已经下载文件百分比分别为L1,L2,...Li...Ln,(0 <Li <1),则现在有文件A的用户共m+n个,显然里面包括拥有不完整文件的用户。该时间点一个新用户也要下载文件A,新用户从m+n个用户中分别取X1,X2,...Xn,X(n+1)...X(n+m-1),X(n+m)段的文件段下载,每段长度分别为LL1,LL1...,LLi,...,LL(m+n),(0 <LLi <1),单位也是百分比,最后才拼凑这n+m段为完整文件。 从负载均衡考虑,怎样将这m+n个用户的文件分段,是LL1,LL1...,LLi,...,LL(m+n)的方差最小。也即它们相互间差距不大。 请把算法写清楚,有个思路也好。处理的是几百数量的用户下载。 
谢谢!!

解决方案 »

  1.   

    谢谢!补充一下,是在内网运行的。按cnzdgs说法,也就是有些拥有A文件的用户不能分担负载,这样由于建立连接解除连接也要耗费,会否效率不高。还有你的意思是否每个文件段大小的一样,而我的想法是每个用户的分担负载的文件段大小不一定一样。
      

  2.   

    cnzdgs的思路是正确的,优先从活动中的用户去找资源,下载百分比最小的那批用户,可以提供的资源少,程序会逐步平衡到相对比较多的用户处下载,能够有效防止大家扎堆去高层根用户处下载,能尽量避免去一些不活动的客户端上下载。但如果网络中有可能会没有活跃用户,这样没有办法只好随机牺牲几个已经下载完的用户了。
      

  3.   

    恩,了解。据我所知,假如把文件分为10段,用户M正在下载第7段,则在第7段前会有若干段保存在内存中(比如是第5到第6段)。新用户可从他那取这几段文件。是这样吧。另外,提几个问题:
    1,文件怎么分段好,也就是文件是分为10段,还是20段好。
    2,P2P的技术原理的文章,大家有没好推荐,这方面我找过,比较好的好像要收费的。期刊网那些应该不错的吧??我是校园网的,也许可以用用学校的免费刊网。
      

  4.   

    可以参考下linux下的一些开源软件
      

  5.   

    文件分析可参考的因素有两个重点,第一个是当前P2P网络活跃用户数,或称有效文件数,第二点是本身的网络情况。如果网络情况比较良好,那么文件分段才相对要少些,在网络情况不太好的情况下可以相对多一些,另外也可以根据P2P网络活路用户数的多少来分。另外其实分段是一个动态调整策略,不可能是固定的,但也有个范围,如果P2P网络的活路用户数越来越多的活,那么分段的策略就需要相应的增加下载线程来加快文件的下载进度。