多文件并发传输------- 节点选择策略以及资源分配策略

节点选择策略以及资源分配策略

节点的选择 :
当接收端发出文件请求时 资源信息中心 会给一张拥有该资源的列表
这时候 我们可以选择发送次数相对较少的节点进行发送
并给这些节点 平均的分配 这个资源的片段

//        利用桶排序
//        将发送次数作为下标
//        发送过对用次数的节点数量是 值
//        选取 maxSenderCount 个节点

private List<INetNode1> selectMinSendCount(List<INetNode1>  nodeList) {
          List<INetNode1> resultNodeList = new  ArrayList<>();
          
          INetNode1 maxNode = nodeList.get(0);
          
          for (int index = 0; index < nodeList.size();  index++) {
               INetNode1 node = nodeList.get(index);
               if (maxNode.getSendTimes() <  node.getSendTimes()) {
                    maxNode = node;
               }
          }
          int[] sendCount = new int[maxNode.getSendTimes()];
          for (INetNode1 node : nodeList) {
               ++sendCount[node.getSendTimes()];
          }
          int maxSenderCount = this.maxSenderCount;
          for (int index = 0; index < sendCount.length;  index++) {
               if (maxSenderCount < 0) {
                    sendCount[index] = 0;
               } else {
                    maxSenderCount -= sendCount[index];
                    if (maxSenderCount < 0) {
                         sendCount[index] += maxSenderCount;
                    }
               }
          }
          
          for (INetNode1 node : nodeList) {
               int index = node.getSendTimes();
               if (sendCount[index] <= 0) {
                    continue;
               }
               resultNodeList.add(node);
               sendCount[index]--;
          }
          
          return resultNodeList;
     }

资源的分配;
// 将资源基础信息里面的 资源框架信息列表·
// 按照 各个文件片段按依据senderCount 进行分割
// 最后每一个发送端都只发送相应的 各个文件里面的对应片段

  public List<SectionInfo>[]  allocationSection(List<SectionInfo> orgResource, int  sendCount) {
          if (sendCount <= 0) {
               return null;
          }
          
          Object[] result = new Object[sendCount];
          for (int index = 0; index < result.length;  index++) {
               List<SectionInfo> sectionList = new  ArrayList<>();
               result[index] = sectionList;
          }
          int index = 0;
          for (SectionInfo section : orgResource) {
//             当片段的长度已经 小于要分割成的片段的长度时
//             直接加到片段数组里面
               int sectionSize = section.getSize();
               if (sectionSize <= maxSectionLength) {
                    List<SectionInfo> sectionList =  (List<SectionInfo>) result[index];
                    sectionList.add(new  SectionInfo(section));
                    index = (index + 1) % sendCount;
                    continue;
               }
//             片段比较大时将片段分割成小块
//             并加入 片段数组里面
               long offset = 0L;
               int restLen = sectionSize;
               int len;
               while (restLen > 0) {
                    len = restLen > maxSectionLength ?  maxSectionLength : restLen;
                    
                    List<SectionInfo> sectionList =  (List<SectionInfo>) result[index];
                    sectionList.add(new  SectionInfo(section.getFileHandle(),
                              offset + section.getOffset(),  len));
                    offset += len;
                    restLen -= len;
                    index = (index + 1) % sendCount;
               }
          }
          
          return (List<SectionInfo>[]) result;
     }
     
全部评论

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务