• 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;
        }
    }
  • 相关阅读:
    C++后台开发校招面试常见问题
    算术表达式的前缀,中缀,后缀相互转换
    Redis键值对数据库的设计与实现
    C++经典面试题(最全,面中率最高)
    C++开发工程师面试题大合集
    C++中常用的设计模式
    C++中const修饰函数,函数参数,函数返回值的作用
    C++main函数的参数介绍以及如何在main函数前执行一段代码
    Windows系统下安装tensorflow+keras深度学习环境
    第十三周学习总结
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12200140.html
Copyright © 2020-2023  润新知