Esempio n. 1
0
def calc(arr, max_size):
    import  heapq;

    print max_size
    nxt = arr[:];
    pos = {};

    for i in range(len(arr)):
        pos[arr[i]] = len(arr);

    for i in reversed(range(len(arr))):
        nxt[i] = pos[arr[i]];
        pos[arr[i]] = i;

    print nxt;
    prio_queue = RBTree();
    in_queue = {};
    cache_miss = 0;
    cur_in_queue_cnt = 0;
    print arr;
    
    for i in range(len(arr)):
        out_str = str(i)+" ";
        print prio_queue;
        #cache missed
        if in_queue.has_key(arr[i]) == False:
            #while( space need):
            out_str += "Missed: ";
            cache_miss +=1;
            #add into cache
            
            if (cur_in_queue_cnt+1>max_size):
        
                del in_queue[prio_queue.min_item()[1]];
                
                cur_in_queue_cnt-=1;
                out_str+= str(prio_queue.min_item()[1])+" is kicked. And ";
                prio_queue.discard(prio_queue.min_key());
              
                
                
            out_str+= str(arr[i])+" is added into Q.";
            prio_queue.insert((-nxt[i],i),arr[i]);

            cur_in_queue_cnt+=1;
            in_queue[arr[i]] = 1;
        else :
            prio_queue.discard(prio_queue.ceiling_key((-i,0)));
            prio_queue.insert((-nxt[i],i),arr[i]);
            
            out_str += str(arr[i])+" hit.";

        print out_str;
        print cur_in_queue_cnt;
        #print prio_queue.q;

    print "Cache hit: "+str(len(arr)-cache_miss);
    print "Cache miss: "+str(cache_miss);
    print "Ratio: "+ str((len(arr)-cache_miss)*1.0/len(arr));