1、如何将文件映射到内存

实际案例:

(1)在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问。(framebuffer设备文件)

(2)某些嵌入式设备,寄存器被编址到内存地址空间,我们可以映射/dev/mem某范围,去访问这些寄存器。

(3)如果多个进程映射同一个文件,还能实现进程通信的目的。

解决方案:

使用标准库中mmap模块的mmap()函数,它需要一个打开的文件描述作为参数。

2、代码演示

# 使用dd命令创建大小为1M的,每个字节都是0的二进制文件demo.bin
~ % dd if=/dev/zero of=demo.bin bs=1024 count=1024
1024+0 records in
1024+0 records out
1048576 bytes transferred in 0.008838 secs (118644037 bytes/sec)
# 以16进制形式查看这个文件
~ % od -x demo.bin
0000000      0000    0000    0000    0000    0000    0000    0000    0000
*
4000000
# 接下来对这个文件进行映射
import mmap'''
mmap.mmap函数介绍:需要注意对于不同的平台对这个函数使用稍有差别。Windows: mmap(fileno, length[, tagname[, access[, offset]]])Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])fileno为文件描述符,并不是一个文件对象,文件描述符是由系统调用的open函数得到的,系统调用的open函数在os.open(),也可以使用python的open函数offset为指定映射区域,必须以页对齐的
'''# b为二进制模式,r+为读写权限
f = open('demo.bin', 'r+b')
# 得到文件描述符
print(f.fileno())
# 做映射,映射区域长度为0映射整个文件,访问权限写
mn = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_WRITE)
# m为mmap对象类似于数组一样的操作
print(type(mn))
print(mn[0])
print(mn[10:20])
# 对文件进行写操作
mn[0] = 88
# 字符串长度和切片长度保持一致
mn[4:8] = b'\xff' * 4
# 设置offset跳过4个页,并且映射8个页
mn2 = mmap.mmap(f.fileno(), mmap.PAGESIZE * 8, access=mmap.ACCESS_WRITE,
offset=mmap.PAGESIZE * 4)
# 对切片进行修改
mn2[:0x1000] = b'\xaa' * 0x1000
修改文件映射内存的内容并查看
# 修改映射地址内容
# 查看[0]、[4:8]和[:0x1000]内容修改~ % od -x demo.bin
0000000      0058    0000    ffff    ffff    0000    0000    0000    0000
0000020      0000    0000    0000    0000    0000    0000    0000    0000
*
0040000      aaaa    aaaa    aaaa    aaaa    aaaa    aaaa    aaaa    aaaa
*
0050000      0000    0000    0000    0000    0000    0000    0000    0000
*
4000000

Python将文件映射到内存使用mmap.mmap()函数相关推荐

  1. Android mmap 文件映射到内存介绍

    本文链接: Android mmap 文件映射到内存介绍 Android开发中,我们可能需要记录一些文件.例如记录log文件.如果使用流来写文件,频繁操作文件io可能会引起性能问题. 为了降低写文件的 ...

  2. 22. 将文件映射到内存

    要求: 在访问某些二进制文件时,希望能把文件映射到内存中,可以像数组一样实现随机访问(例如linux的framebuffer设备文件). 某些嵌入式设备,寄存器被编址到内存地址空间,可以映射linux ...

  3. linux 文件IO与内存映射:内存映射

    前言 前面几篇我们学习了用户空间的IO缓冲区,以及IO缓冲区的分散聚合IO技术. 为了减少系统调用的次数,提升系统性能,操作系统开发者门提出了这么多的缓存技术. 但是到这里这些技术同样有不足的地方:不 ...

  4. Linux 内存映射之文件映射

    Linux 内存映射之文件映射 文章目录 Linux 内存映射之文件映射 文件映射 匿名映射 文件的私有映射与共享映射 创建映射 mmap() 文件映射的边界情况 正常文件范围的内存映射 超出文件范围 ...

  5. 使用mmap实现文件映射

    1 文件映射 传统文件访问方式是, 首先用open系统调用打开文件, 然后使用read, write以及lseek等调用进行顺序或者随即的I/O. 这种方式是非常低效的, 每一次I/O操作都需要一次系 ...

  6. 共享内存简介和mmap 函数

    一.共享内存简介 共享内存区是最快的IPC形式,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据. 即每个进程地址空间都有一个共享存储器的映射区,当这块区 ...

  7. 用Python处理文件的实用姿势

    这是"Python1024-自动化办公"的第一篇. 在Python1024的基础篇中,我们已经介绍过文件管理和文本文件的读写: <编程的第一个应用,往往都从文件读写开始> ...

  8. python 读写文件 另存为_python读写文件(五)

    今天继续分享python读写文件. 首先介绍一个新的函数open(),这个函数是干什么的呢?在python里面可以用open函数来打开文件.要用open函数打开一个文件,就是要向它传递一个字符串路径, ...

  9. linux mmap内存文件映射

    一.传统文件访问 unix访问文件的传统方法使用open打开他们,如果有多个进程访问一个文件,则每一个进程在再记得地址空间都包含有该文件的副本,这不必要地浪费了存储空间.下面说明了两个进程同时读一个文 ...

最新文章

  1. 她是985高校的90后博导!常被认成“师姐”,喜欢减压式教学
  2. 解决mysql插入中文出现错误Incorrect string value: ‘\xE7\xA8\x8B\xE5\xBA\x8F...‘ for column ‘course‘ at row 1
  3. java手机飞行模式_用了这么多年手机才知道,飞行模式还藏着这6个功能!太好用了...
  4. win10下安装pyspark及碰到的问题
  5. Silverlight 4.0 Accordion 解决ScrollViewer 的问题
  6. java开发环境实验总结_20155229 实验一《Java开发环境的熟悉》实验报告
  7. 从0开始的spss数据分析学习之路
  8. 谱尼软件测试谱尼为网络安全护航
  9. IM 即时通讯开发如何设计图片文件的服务端存储架构
  10. 如何屏蔽移动垃圾短信10658464
  11. Java自学经验分享
  12. 滴滴AI负责人叶杰平:你的每一次出行,都已有AI落地的助力
  13. iphone 中的大小和像素问题
  14. An unexpected error has been detected by Java Runtime Environment
  15. esrally 如何进行简单的自定义性能测试?
  16. H264 FU-A解包分析
  17. SharedPreferences的使用与Sqlite的使用
  18. vue配置多页面应用~
  19. 开源 区块链_区块链将如何影响开源
  20. 如何搭建 Jenkins 自动化测试平台?

热门文章

  1. html5 小红点,大面积起“小红点”,这样该怎么办?或留意下“肝脏”
  2. python调用libpcap_libPcap(基于C)接受基于Python的Socket程序 - python
  3. 操作系统桌面效果:Windows Vista VS Linux Ubuntu
  4. 选股心得:基本面+赢富数据
  5. 豪情-关于生活工作学习之感悟-第一篇
  6. idea如何设置作者信息
  7. 波司登云原生微服务治理探索
  8. Trino连接器扩展(URL)
  9. PatternKitUtils - 常用的正则表达式验证
  10. 泰克AFG31000系列任意波函数发生器应用