当前位置: 首页 > news >正文

阿城区建设小学网站成都建模培训

阿城区建设小学网站,成都建模培训,高端客户开发,福州+网站建设+医疗内存映射模块读写文件提高IO性能mmap 1.概述 这篇文章介绍下与普通读写文件不同的方式#xff0c;内存映射读写文件。在什么情况下才会用到内存映射操作文件那#xff0c;还是要先了解下他。 1.1.内存映射与IO区别 常规操作IO开销 常规的操作文件是经过下面几个环节操作I…内存映射模块读写文件提高IO性能mmap 1.概述 这篇文章介绍下与普通读写文件不同的方式内存映射读写文件。在什么情况下才会用到内存映射操作文件那还是要先了解下他。 1.1.内存映射与IO区别 常规操作IO开销 常规的操作文件是经过下面几个环节操作IO读写文件操作过程比较复杂耗费时间较长。尤其是操作大文件时需要不断的增加IO操作次数延迟就会增大。 通过系统调用将控制权转移到内核或核心操作系统代码与文件所在的物理磁盘交互将数据复制到用户空间和内核空间之间的不同缓冲区 内存映射开销 避免此开销的一种方法是使用内存映射文件。您可以将内存映射描绘成一个过程在该过程中读取和写入操作跳过上述许多层并将请求的数据直接映射到物理内存中。因为对于每次访问它不涉及单独的系统调用也不会在缓冲池之间复制数据而是内核和用户程序可以直接访问内存。 内存映射文件 I/O 方法为了速度而牺牲了内存使用量这通常称为时空权衡。但是内存映射不必使用比传统方法更多的内存。操作系统非常聪明。它将在请求时延迟加载数据类似于 Python 生成器的工作方式。 此外借助虚拟内存您可以加载大于物理内存的文件。但是当没有足够的物理内存用于文件时您不会看到内存映射带来的巨大性能改进因为操作系统将使用较慢的物理存储介质如固态磁盘来模拟它缺少的物理内存。 2.测试数据 所有的例子都将使用文本文件 lorem.txt在当前目录创建lorem.txt文件并复制下面的内容到文件。 Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec egestas, enim et consectetuer ullamcorper, lectus ligula rutrum leo, a elementum elit tortor eu quam. Duis tincidunt nisi ut ante. Nulla facilisi. Sed tristique eros eu libero. Pellentesque vel arcu. Vivamus purus orci, iaculis ac, suscipit sit amet, pulvinar eu, lacus. Praesent placerat tortor sed nisl. Nunc blandit diam egestas dui. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Aliquam viverra fringilla leo. Nulla feugiat augue eleifend nulla. Vivamus mauris. Vivamus sed mauris in nibh placerat egestas. Suspendisse potenti. Mauris massa. Ut eget velit auctor tortor blandit sollicitudin. Suspendisse imperdiet justo.3.内存映射操作文件 3.1.读取内容 使用 mmap() 创建一个内存映射文件对象mmap是一个类它的构造器参数如下 fileno是一个文件描述符要么是来自 file 对象的 fileno() 方法 要么来自 os.open()。使用者负责在调用 mmap() 之前打开文件并且在使用结束之后关闭它。length入 mmap() 的参数是要去映射的文件内容的大小。如果值是 0 那么代表映射整个文件。如果这个值超过当前文件文件将会被扩展tagnameNonaccessNoneACCESS_READ 表示只读ACCESS_WRITE 表示直接写对内存的操作直接写入文件或者 ACCESS_COPY 用于写时复制内存分配不写入文件offsetNone import mmapwith open(lorem.txt, r) as f:with mmap.mmap(f.fileno(), 0,accessmmap.ACCESS_READ) as m:print(First 10 bytes via read :, m.read(10))print(First 10 bytes via slice:, m[:10])print(2nd 10 bytes via read :, m.read(10))文件指针会追踪切片操作上次读取的位置。这个例子中第一次读取之后指针向前移动了 10 字节。在切片操作开始之前文件指针重置到文件开始处然后又向前移动了 10 字节。切片操作之后调用 read(10) 将会得到文件 11-20 字节的内容。 First 10 bytes via read : bLorem ipsu First 10 bytes via slice: bLorem ipsu 2nd 10 bytes via read : bm dolor si3.2.写 为了设置一个内存映射文件去接受更新要以追加模式 r 而不是 w打开然后再进行映射。然后可以使用任何更新数据的 API有两种方式改变内容调用write方法和切片方式修改。 1.切片方式修改内容 import mmap import shutil# 复制示例文件 shutil.copyfile(lorem.txt, lorem_copy.txt)word bconsectetuer reversed word[::-1] print(Looking for :, word) print(Replacing with :, reversed)with open(lorem_copy.txt, r) as f:with mmap.mmap(f.fileno(), 0) as m:print(Before:\n{}.format(m.readline().rstrip()))m.seek(0) # rewindloc m.find(word)# 通过切片方式修改文件内容m[loc:loc len(word)] reversedm.flush()m.seek(0) # rewindprint(After :\n{}.format(m.readline().rstrip()))f.seek(0) # rewindprint(File :\n{}.format(f.readline().rstrip()))运行结果,内存和文件中第一行中间部分的 「consectetuer」将被替换。 Looking for : bconsectetuer Replacing with : breutetcesnoc Before: bLorem ipsum dolor sit amet, consectetuer adipiscing elit. After : bLorem ipsum dolor sit amet, reutetcesnoc adipiscing elit. File : Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit. 2.write方法修改内容 import mmapdef mmap_io_write(filename, text):with open(filename, modew, encodingutf-8) as file_obj:with mmap.mmap(file_obj.fileno(), length0, accessmmap.ACCESS_WRITE) as mmap_obj:mmap_obj.write(text)3.3.复制 使用模式 ACCESS_COPY 访问文件将不会将更新内容写入到磁盘文件 import mmap import shutil# 复制示例文件 shutil.copyfile(lorem.txt, lorem_copy.txt)word bconsectetuer reversed word[::-1]with open(lorem_copy.txt, r) as f:with mmap.mmap(f.fileno(), 0,# 复制模式accessmmap.ACCESS_COPY) as m:print(Memory Before:\n{}.format(m.readline().rstrip()))print(File Before :\n{}\n.format(f.readline().rstrip()))m.seek(0) # rewindloc m.find(word)# 修改文件内容m[loc:loc len(word)] reversedm.seek(0) # rewindprint(Memory After :\n{}.format(m.readline().rstrip()))f.seek(0)print(File After :\n{}.format(f.readline().rstrip()))这个例子中将文件句柄和 mmap 句柄分开是必要的with句柄是fmmap句柄是m因为两个对象的内部状态是单独维护的。 运行结果中accessmmap.ACCESS_COPY)复制模式只修改了内存中的文件内容不会将内容写入到磁盘。 Looking for : bconsectetuer Replacing with : breutetcesnoc Before: bLorem ipsum dolor sit amet, consectetuer adipiscing elit. After : bLorem ipsum dolor sit amet, reutetcesnoc adipiscing elit. File : Lorem ipsum dolor sit amet, reutetcesnoc adipiscing elit. 3.4.正则表达式 因为一个内存映射文件拥有一个字符串的行为因此可以使用其他操作字符串的模块如正则表达式一起使用。这个例子中将会找到所有以「nulla」开始的句子 import mmap import repattern re.compile(rb(\.\W)?([^.]?nulla[^.]*?\.),re.DOTALL | re.IGNORECASE | re.MULTILINE)with open(lorem.txt, r) as f:with mmap.mmap(f.fileno(), 0,accessmmap.ACCESS_READ) as m:for match in pattern.findall(m):print(match[1].replace(b\n, b ))运行结果 bNulla facilisi. bNulla feugiat augue eleifend nulla.
http://www.dnsts.com.cn/news/255715.html

相关文章:

  • 网站建设需要的软件怎么在线上推广自己的产品
  • 海南住房建设厅网站公众号做电影网站赚钱
  • 有个网站做字的图片晋城市住建设局网站
  • 建设游戏网站2023能用的磁力搜索引擎
  • 开发一个交易网站多少钱网站设计与开发的基本步骤包括哪些
  • 如何做网站维护网站成功案例设计
  • 泉州哪里做网站开发网站建设中服务器搭建方式
  • 北京seo公司网站网站代搭建维护
  • 网站建设厘金手指排名二二山东平台网站建设多少钱
  • 自学网站编程中国建设工程招投网站
  • 网站跳到另一个网站怎么做教师网络培训平台登录入口
  • 自动化设备技术支持东莞网站建设网站seo新手
  • 泉州公司建设网站腾讯会议多少钱一个月
  • 建宣传网站高米店网站开发公司
  • WordPress禁用评论回收站wordpress使用memcached
  • 论坛网站模板开设计工作室赚钱吗
  • 网站 项目方案扬州网站建设推广
  • 河南手机网站设计广东做网站公司
  • 开公司先建设网站怎么做自己的卡盟网站
  • 手机可做兼职的网站吉林省工伤保险网站
  • 网站字体怎么修改网视易网站建设
  • 长安响应式网站建设学完html怎么做网站
  • 金安合肥网站建设专业禅城网站建设价格
  • 做网站用html还是python好互联网系统名称
  • mooc 网站建设情况wordpress站群管理破解版
  • 做销售的什么网站好做个小程序需要花多少钱
  • 手机端网站外部链接如何去优化sem优化是什么意思
  • 南平公司做网站wordpress左右翻页
  • 公司网站最新版江苏省住房和城乡建设厅官网
  • 网站规划与建设 第2版ppt做婚纱的网站