• java构造简易的FIFO缓冲淘汰方法


    在java中,通常可以使用HashMap作为cache来加速程序的运行。一般地,若对一个方法的结果进行缓冲,仅需要将方法的参数列表作为key,方法的返回结果作为value即可。

    但若程序对该方法访问过于频繁,大量的缓冲信息占用大量内存,严重的情况下会导致内存不足而异常退出。如果可以在HashMap达到一定大小后,自动删除最早放入HashMap那部分数据,就可以达到缓冲大小的控制。然而,HashMap是一个无序的数据结构,我们并不能从HashMap中获取到每条记录入库的先后顺序。

    解决方法:可以使用List嵌套HashMap的方法来实现一个简单的FIFO缓冲淘汰方法。list中可以放4个HashMap,有限填写list中的第一个HashMap,当HashMap填写了1000条时,则将list最后一个HashMap从list删除,在list第一个位置插入一个新的HashMap。

    通过如上方法构造的缓冲区最多存储4000条信息,当达到4000条信息后,会自动清理最先进入缓冲区的1000条信息。

    使用该方法的代价是判断一条数据在不在缓冲区中时需要访问4个HashMap并调用containsKey。此代价相对于缓冲的方法来说可忽略不计。

    下面是一些代码的片段

    
    class BufferMap<K,V>{
        private static final int QUEUE_LEN=4;
        ArrayList<HashMap<K,V>> queue = new ArrayList<>();
        private final int buffersize;
        public BufferMap(int buffersize){
            this.buffersize=buffersize;
            for(int i=0;i<QUEUE_LEN;i++){
                queue.add(new HashMap<K,V>());
            }
        }
        public void put(K key,V value){
            if(queue.get(queue.size()-1).size()>=buffersize/QUEUE_LEN && !queue.get(queue.size()-1).containsKey(key)){
                HashMap<K, V> remove = queue.remove(0);
                remove.clear();
                queue.add(remove);
            }
            queue.get(queue.size()-1).put(key, value);
           
        }
    
        public V get(K key){
            for(HashMap<K,V> hm:queue){
                if(hm.containsKey(key)){
                    return hm.get(key);
                }
                
            }
            return null;
        }
    }
  • 相关阅读:
    hadoop-0.20-集群搭建___实体机通过SSH访问基于VM安装的Linux
    Kettle的集群排序 2——(基于Windows)
    在使用Kettle的集群排序中 Carte的设定——(基于Windows)
    POJ3083
    本地tomcat访问mysql数据库
    正则表达式——(一)
    图论——读书笔记 (深度优先搜索)
    c# 反射+Attribute 实现获取Description的两种做法
    排序方法的总结
    c# 初识Actor Model
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12200140.html
Copyright © 2020-2023  润新知