首页 > 编程语言 >Python工具箱系列(四十五)

Python工具箱系列(四十五)

时间:2023-11-06 16:44:06浏览次数:29  
标签:文件 映射 四十五 Python mmap mp 工具箱 os 内存

内存映射文件

mmap是python内置标准库,提供将文件映射到内存的机制。通过mmap将文件映射到内存之后,我们可以高效并优雅地对文件的内容进行随机访问。通常打开文件后要通过组合各种seek()、read()和write()调用来访问,使用mmap后可以简单将文件映射到内存,然后通过切片操作来访问数据。需要强调的是,对某个文件进行内存映射并不会导致将整个文件读到内存中。也就是说,文件并不会拷贝到某种内存缓冲区或数组上。相反,操作系统只是为文件内容保留一段虚拟内存而已。当访问文件的不同区域时,文件的这些区域将被读取并按照需要映射到内存区域中。但是,文件中从未访问过的部分会简单地留在磁盘上。这一切都是以透明的方式在幕后完成的。

以下代码演示了一个基本的映射操作过程:

import mmap

# 打开一个已经存在的文件并且输出
targetfile = r'gotoolkits\resources\poetry.txt'
with open(targetfile, mode="r", encoding='utf-8') as f:
    print(f.read())

with open(targetfile, "r+b") as f:
    # 在内存中进行映射。0表示文件内容全部映射
    mm = mmap.mmap(f.fileno(), 0)
    end = mm.size()

    # 读一行ls
    print(mm.readline().decode('utf-8'))
    # 分片读
    print(mm[:12].decode('utf-8'))

    # 在文件尾写一句话
    modifystr = " world!\n"
    mm.seek(end-len(modifystr))
    mm.write(modifystr.encode('utf-8'))

    # 关闭映射
    mm.close()

mmap另一个用途就是在多个进程间共享内存映射。也就是说多个进程可以同时打开一个文档,同时进行操作。下面的代码简单示例了2个进程同时操作一个文档的过程。以下代码为mmap1.py:

import mmap
import os

targetfile = r'd:\dev\gotoolkits\resources\mmapshare.txt'


def memory_map(filename, access=mmap.ACCESS_WRITE):
    size = os.path.getsize(filename)
    fd = os.open(filename, os.O_RDWR)
    return mmap.mmap(fd, size, access=access)


mp = memory_map(targetfile)
content = mp.read().decode('utf-8')
mp[:] = b'0'*mp.size()
mp.seek(0)

while True:
    job = input("what you want?:").strip()
    if job == 'quit':
        break
    outstr = f"my choice is {job}\n"
    mp.write(outstr.encode('utf-8'))

mp.close()

另一个进程代码mmap2.py类似mmap1.py。稍有区别在于初始时不覆盖内存的当前内容,同时为了演示方便,将映射操作的起点定在了虚拟内存的一半处。相关代码如下:

import mmap
import os

targetfile = r'd:\dev\gotoolkits\resources\mmapshare.txt'


def memory_map(filename, access=mmap.ACCESS_WRITE):
    size = os.path.getsize(filename)
    fd = os.open(filename, os.O_RDWR)
    return mmap.mmap(fd, size, access=access)


mp = memory_map(targetfile)
mp.seek(round(mp.size()/2))

while True:
    job = input("what you want?:").strip()
    if job == 'quit':
        break
    outstr = f"my choice is {job}\n"
    mp.write(outstr.encode('utf-8'))

mp.close()

运行的效果如下图所示:

从图中可以看出,同时运行mmap1.py与mmap2.py,并且分别输入不同的内容。最终在mmapshare.txt文件中体现了2个进程对它的修改。

标签:文件,映射,四十五,Python,mmap,mp,工具箱,os,内存
From: https://www.cnblogs.com/shanxihualu/p/17813096.html

相关文章

  • python多进程提高性能
    在Python中,可以使用multiprocessing模块来实现多进程。下面是一个简单的例子,用来演示在Python中如何创建多个子进程:importmultiprocessingdefworker(num):"""打印子进程的编号"""print('Worker',num)if__name__=='__main__':#创建4个子进程foriin......
  • 《python基础教程(第二版)》学习笔记 文件和素材(第11章)
    《python基础教程(第二版)》学习笔记文件和素材(第11章)打开文件:open(filename[,mode[,buffering]])mode是读写文件的模式f=open(r'c:\somefile.txt')#默认是读模式+表示是可以读写;r读模式;w写模式;a追加模式;b二进制模式;换行符在Windows为\r\n,在Unix中为\n,Python会自动转......
  • 《python基础教程(第二版)》学习笔记 函数(第6章)
    《python基础教程(第二版)》学习笔记函数(第6章)创建函数:deffunction_name(params):blockreturnvalues记录函数:deffunction_name(params):'NOTE'#注释blockreturnvaluesfunction_name.__doc__help(function_name)return#没有返回值位置参数和关键字参数:关......
  • 《python基础教程(第二版)》学习笔记 类和对象(第7章)
    《python基础教程(第二版)》学习笔记类和对象(第7章)定义类classPerson:defsetName(self,name):self.name=namedefgetName(self):returnself.namefoo=Person()foo.setName('AAA')foo.getName()foo.namefoo.name='BBB'私有属性,名字前面加上......
  • 在Python中获取飞书群消息,你可以使用`feishu-python-sdk`这个库¹。这是一个用于和飞
    在Python中获取飞书群消息,你可以使用`feishu-python-sdk`这个库¹。这是一个用于和飞书开放平台交互的Python库,它支持同步调用和异步调用,实现了订阅事件和卡片交互回调¹。首先,你需要安装这个库,可以使用pip进行安装:```pythonpipinstallfeishu-python-sdk```然后,你可以使用以......
  • 从零开始构建报警中心:part02 使用python脚本接收zabbix报警信息-2
    在上篇中完成了对报警媒介与动作的配置在动作配置中,有一项是发送到配置,这个需要配置到用户与报警媒介之间进行绑定。具体操作如下点击“管理”-》“用户”,点击要操作的用户再点击“报警媒介”,点击“添加”进行操作在弹出的对话框上点选类型,选择之前对应配置的报警媒介,并添加。如果......
  • Python IDE
    1.VimVim可以说是Python最好的IDE。Vim是高级文本编辑器,旨在提供实际的Unix编辑器‘Vi’功能,支持更多更完善的特性集。Vim不需要花费太多的学习时间,一旦你需要一个无缝的编程体验,那么就会把Vim集成到你的工作流中。2.EclipsewithPyDevEclipse是非常流行的IDE,而且......
  • 如何使用Python将PDF转为Excel
    PDF文件是一种静态文档格式,通常难以编辑,而Excel则是一个灵活的表格工具。如果你需要处理PDF表格中的数据,那么将其导出为Excel文件可以大大节省工作时间和精力。Excel提供的强大数据编辑和格式化功能,允许你对转换后的PDF数据进行修改、排序、筛选、计算等操作。同时,你还可以调整单......
  • (十)Python之数字类型
    数字类型数字类型用于存储数值,他们是不可改变的数据类型,这意味着改变数字数据类型会分配一个新的对象,当你指定一个值时,Number对象就会被创建:num=15int:整型Python3整型是没有限制大小的,可以当作long类型使用,所以Python3没有Python2的long类型,举例1010055float:浮点型用来表......
  • (十一)Python之字符串类型
    字符串类型Python中的字符串用单引号(‘’)或双引号(”“)括起来,同时使用反斜杠(\)转义特殊字符语法:s=”a1a2...an“(n>=0)Python使用单引号(‘)、双引号(“)、三引号(”“”)来表示字符串、其中三引号可以由多行组成,它是编写多行文本的快捷语法,常用于文档字符串,在文件的特定地点,被当作注......