python实现线下缓存最优算法

对于现代计算机为了加快数据存储速度,一般会采用多级缓存的方法,以最简单的二级缓存来说,数据会存放在两个地方,一个地方就是存在内存当中,另一个存放的地方就是存放在硬盘当中,但是这两个地方数据读取的速度是完全不同的。

而CPU从内存中读取数据的速度是要远远快与从硬盘中读取数据的速度,但问题在于缓存的价格是要远远高于硬盘的价格的,所以缓存的内容就会远远小于硬盘的容量。当CPU需要读取特定的数据的时候,CPU就会现在内存当中进行查找,如果数据已经存储在内存中,它就可以直接读取。

而当数据是没有存储在内存当中的时候,那么CPU就会把数据从硬盘当中读取出来,然后存放在缓存当中,这里的问题主要在于如果内存已经被用完了,那么CPU就必须先将内存当中存储的某些数据输出到硬盘当中去,空出空间来以便存放要从硬盘当中读取的数据。

而当CPU从内存中得到他想要获取的数据的时候,我们就可以成为cache hit,当CPU发现内存中不存在想要读取的数据的时候,我们就称为cache miss,由于内存是有限的,我们就需要设计高效的缓存调度算法以便决定当需要把数据从内存输出到硬盘时,如何选择要调出的数据以便让cache miss的次数尽可能的少。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

例如如上的例子,如何在已经装满了4条数据的情况下,要将某一条数据进行迁出,将空出来的位置留给下数据e的话,这就是缓存调度算法所需要解决的问题。

在这里可以考虑使用最远优先原则来进行算法实现,在已知未来数据访问的情况下,要调度内存中缓存的数据的时候,可以采用最远优先原则,也就是在决定从内存中迁出那条数据的时候,我们看当前在内存中的数据,在即将读取的数据中,哪一条离当前要写入的数据最远。

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

使用python实现的最远优先原则算法如下:

cache_size = 8
C = np.zeros((cache_size))
items = 16  #16种不同的数据
item_count = 100  #需要读取100条数据
R = np.zeros((item_count))
for i in range(item_count):
    R[i] = random.randint(1, 17)
item_map = {}
cache_miss = 0
for i in range(len(R)):
    if R[i] in item_map.keys():  #将数据与它在R中位置对应起来
        l = item_map[R[i]]  
        l.append(i)
    else:
        l = []
        l.append(i)
        item_map[R[i]] = l
for i in range(len(R)): #模拟读取每一条数据
    cache_hit = False
    item_save = False
    for c in C:  #检测缓存是否存在要读取的数据
        if c == R[i]:
            cache_hit = True
            break
    if cache_hit is False:
        cache_miss += 1
        for j in range(len(C)):  #如果缓存还有可用空间,将数据放入缓存
            if C[j] == 0:
                C[j] = R[i]
                item_save = True
                item_map[R[i]].pop(0)
                break
        if item_save is False:  #缓存已满,根据最远优先原则置换
            max_distance = 0
            item_selected = 0
            for j in range(len(C)):
                l = item_map[C[j]]
                if len(l) == 0:  #缓存中的元素不会再从R中被读取,因此将其置换出去
                    item_selected = j
                    break
                distance = item_map[C[j]][0]
                if distance > max_distance:
                    max_distance = distance
                    item_selected = j
            C[j] = R[i]  #将离要读取数据最远的缓存数据进行置换
            item_map[R[i]].pop(0)
print("the count of least cache miss is : ", cache_miss)    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/410130.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中科大计网学习记录笔记(十五):可靠数据传输的原理

前前言:看过本节的朋友应该都知道本节长度长的吓人,但其实内容含量和之前的差不多,老师在本节课举的例子和解释比较多,所以大家坚持看完是一定可以理解透彻的。本节课大部分是在提出问题和解决问题,先明确出现的问题是…

编码后的字符串lua

-- 长字符串 local long_string "你好你好你好你好你好你好你好你好" local encoded_string "" for i 1, #long_string do local char_code string.byte (long_string, i) encoded_string encoded_string .. char_code .. "," end encoded_…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言: 这段时间一直专注于数据报表的开发,当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅,美观的Excel文档格式的来展示数据,当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…

springboot项目打成含crud操作的sdk集成到springboot启动引擎项目

一 sdk配置操作 1.1 结构 sdk项目目录中只有基础的service类以及mybatis操作数据库的相关文件,service类中包含查询数据库的方法。 说明: 1.2 sdk的pom打包配置 作为公共项目打成jar供其他项目引用,注意被引入的项目不能使用默认的maven…

python 3.11中安装sympy(符号工具包)

1.python环境: 2.安装遇到问题: 其中一台Win10系统上: … 另一台Win10系统上: 3.升级pip cmd命令行中,执行如下命令: python.exe -m pip installl --upgrade pip 4.再次安装sympy cmd命令行中&…

NotePad2轻便够用的文本编辑器

下载方式: 360软件管家里就可以安装,非常的方便。 打开后,界面如下: 可以拖拽打开文本,和notepad的功能差不多,可以平行替代。

苹果分拣检测YOLOV8NANO

苹果分拣,可以检测成熟、切片、损坏、不成熟四种类型,YOLOV8NANO,训练得到PT模型,然后转换成ONNX,OPENCV的DNN调用,支持C,PYTHON 苹果分拣检测YOLOV8NANO,检测四种类型苹果

电子书推荐|IT 基础架构团队的 K8s 管理(含最新性能评测)

越来越多的企业采用 Kubernetes 支持应用的快速开发与交付,Kubernetes 的部署与管理任务也逐渐向 IT 基础架构团队倾斜。尤其是对于习惯了传统虚拟化环境的基础架构工程师,容器环境的管理方式往往会带来诸多困扰: Kubernetes 使用门槛高&…

5.2 Ajax 数据爬取实战

目录 1. 实战内容 2、Ajax 分析 3、爬取内容 4、存入MySQL 数据库 4.1 创建相关表 4.2 数据插入表中 5、总代码与结果 1. 实战内容 爬取Scrape | Movie的所有电影详情页的电影名、类别、时长、上映地及时间、简介、评分,并将这些内容存入MySQL数据库中。 2、…

提高SQL查询效率1——验证索引的有效性

在大数据量的SQL表中,往往会出现一些查询效率低的问题,耗时,如果解决这里问题呢?本文主要探索索引在提高SQL效率的有效性。 目录 1、创建数据表 2、为建立索引之前,查看执行效率 3、给Name建立索引 4、查看索引 1、…

AI书籍推荐 | 使用 ChatGPT MILLIONAIRE 指南走向财务自由

本文中的链接若打不开,您可能需要科学上网哦! 跳进数字时代的大潮,想把握住人工智能带来的财富机会? 那就别眨眼!一本名为《ChatGPT MILLIONAIRE》的书籍,你可以了解一下。从Chat GPT精通系列来袭&#x…

office word保存pdf高质量设置

1 采用第三方pdf功能生成 分辨率越大质量越好

flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

flutter端创建MethodChannel类 import package:flutter/services.dart;//MethodChannel const methodChannel const MethodChannel(com.flutter.demo.MethodChannel);class FlutterMethodChannel {/** MethodChannel flutter给原生发信息* 在方法通道上调用方法invokeMethod*…

一种基于道路分类特性的超快速车道检测算法

摘要: 本文介绍了一种新颖、简单但有效的车道检测公式。 车道检测是自动驾驶和高级驾驶员辅助系统 (ADAS) 的基本组成部分,在实际高阶驾驶辅助应用中,考虑车道保持、转向、限速等相关的控制问题,这种方式通常是通过受限的车辆计算…

【牛客】2024牛客寒假算法基础集训营6ABCDEGHIJ

文章目录 A 宇宙的终结题目大意主要思路代码 B 爱恨的纠葛题目大意主要思路代码 C 心绪的解剖题目大意主要思路代码 D 友谊的套路题目大意主要思路代码 E 未来的预言题目大意主要思路代码 G 人生的起落题目大意主要思路代码 I 时空的交织题目大意主要思路代码 J 绝妙的平衡题目…

Kotlin 进阶版 协程

kotlin是协程的一种实现 Dispatchers.IO:适用于执行磁盘或网络 I/O 操作的调度器,例如文件读写、网络请求等。在 Android 中,Dispatchers.IO 会使用一个专门的线程池来处理这些操作,以防止阻塞主线程。 Dispatchers.Main&#xf…

幻兽帕鲁服务器多少钱?有买过的吗?

幻兽帕鲁服务器多少钱?太卷了,降价到24元1个月,阿里云4核16G10M游戏服务器26元1个月、149元半年,腾讯云4核16G游戏服务器32元、312元一年,华为云26元,京东云主机也是26元起。云服务器吧yunfuwuqiba.com给大…

[RCTF2015]EasySQL1 题目分析与详解

一、题目介绍: 1、题目来源: BUUCTF网址 2、题目介绍: 拿到flag。 二、解题思路: 我们发现题目首页有登录和注册账号两个选项,我们首先尝试注册账号,尝试注册username为admin的账号,输入密码…

这10款设计工具,助你轻松搞定主视觉设计!

我们浏览网站、App或其他数字产品时,页面或屏幕上最显著最重要的部分,比如设计风格、颜色、排版、图片和元素等信息,就是数字产品的主视觉,也是用户首次接触产品时最能直观感受的部分。 由此可见,主视觉设计有多重要&…