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

Python工具箱系列(四十五)

时间:2023-11-06 17:05:16浏览次数:33  
标签:文件 映射 四十五 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()

运行的效果如下图所示:

Python工具箱系列(四十五)_txt文件

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

标签:文件,映射,四十五,Python,mmap,mp,工具箱,os,内存
From: https://blog.51cto.com/shanxihualu/8214262

相关文章

  • Python分享之特殊方法与多范式
    Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来编写相同功能的程序(还有函数式、声明式等,我们暂不深入)。Python的多范式依赖于Python对象中的特殊方法(specialmethod)。特殊方法名的前后各有......
  • 利用python简单采集公众号
    今天用python写一个采集公众号文章的爬虫,目前还没有做具体的优化,只供学习,一起来看看吧。```pythonimportrequestsfrombs4importBeautifulSoupproxy_host="www.duoip.cn"proxy_port=8000url="https://mp.weixin.qq.com/s?"#微信公众号文章网址headers={"User-A......
  • 运用python采集抖音评论
    今天给大家带来的是用Python编写的一个简单的抖音爬虫程序,来采集抖音评论的内容。让我们一起来看学一下吧。```pythonimportrequestsimportjson#设置代理信息proxy_host='https://www.duoip.cn/get_proxy'proxy_port=8000#爬虫网址url='https://www.douyin.com/vi......
  • Python工具箱系列(四十五)
    内存映射文件mmap是python内置标准库,提供将文件映射到内存的机制。通过mmap将文件映射到内存之后,我们可以高效并优雅地对文件的内容进行随机访问。通常打开文件后要通过组合各种seek()、read()和write()调用来访问,使用mmap后可以简单将文件映射到内存,然后通过切片操作来访问数据......
  • 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
    在上篇中完成了对报警媒介与动作的配置在动作配置中,有一项是发送到配置,这个需要配置到用户与报警媒介之间进行绑定。具体操作如下点击“管理”-》“用户”,点击要操作的用户再点击“报警媒介”,点击“添加”进行操作在弹出的对话框上点选类型,选择之前对应配置的报警媒介,并添加。如果......