首页 > 编程语言 >Python存储与读写二进制文件

Python存储与读写二进制文件

时间:2024-09-09 17:47:00浏览次数:7  
标签:tmp 存储 字节 Python 读写 二进制 PAGE SIZE

技术背景

一般情况下我们会选择使用明文形式来存储数据,如json、txt、csv等等。如果是需要压缩率较高的存储格式,还可以选择使用hdf5或者npz等格式。还有一种比较紧凑的数据存储格式,就是直接按照二进制格式存储。这种格式下,存储的数据之间没有间隔符,在没有压缩的情况下应该是体积最小的存储类型。

使用方法

在Python中,我们可以使用numpy.tofile()功能,直接将numpy数组类型存储到一个二进制文件中。读取的时候,虽然可以直接使用open(file_name, 'rb')来进行读取,但是为了适配大量IO的场景,这里我们使用内存映射mmap的形式来进行数据读取。

完整示例

如下是一个完整的示例代码,相关的功能直接用注释的形式在代码中标记:

import numpy as np
import mmap
import resource
# 获取页数据量大小(单位:字节)
PAGE_SIZE = resource.getpagesize()
# 定义单精度浮点数数据占用字节(单位:字节)
DATA_SIZE = 4
# 计算页存储数据数量(num_float32)
PAGE_FNUM = int(PAGE_SIZE/DATA_SIZE)
print ("The PAGE_SIZE is: {}".format(PAGE_SIZE))
print ("Corresponding float32 numbers should be: {}".format(PAGE_FNUM))
# 生成示例数据,使用PAGE_FNUM+4大小的数据量定义两页数据
tmp_arr = np.arange(PAGE_FNUM+4).astype(np.float32)
# 数据存储路径
tmp_file = '/tmp/tmp.dat'
# 将数组存储到二进制文件中
tmp_arr.tofile(tmp_file)
# 每次从二进制文件中读取4个数据
READ_NUM = 4
with open(tmp_file, 'rb') as file:
    # 第一页数据的内存映射
    mm = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ, offset=0)
    # 第一页数据的1、2、3、4位数据
    print (np.frombuffer(mm.read(DATA_SIZE*READ_NUM), dtype='<f4'))
    # 第一页数据的5、6、7、8位数据
    print (np.frombuffer(mm.read(DATA_SIZE*READ_NUM), dtype='<f4'))
    # 第二页数据的内存映射
    mm = mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ, offset=PAGE_SIZE)
    # 第二页数据的1~4位数据
    print (np.frombuffer(mm.read(DATA_SIZE*READ_NUM), dtype='<f4'))
    # 第二页数据的5~8位数据
    print (np.frombuffer(mm.read(DATA_SIZE*READ_NUM), dtype='<f4'))
    # 关闭内存映射
    mm.close()
# 退出文件IO

该脚本的输出结果为:

The PAGE_SIZE is: 4096
Corresponding float32 numbers should be: 1024
[0. 1. 2. 3.]
[4. 5. 6. 7.]
[1024. 1025. 1026. 1027.]
[]

结果解析

我们打印的第一个数据是页大小,这里显示是4096个字节。而一个单精度浮点数占4个字节,所以一页存了1024个单精度浮点数,也就是第二个打印输出的结果。由于我们定义的numpy数组是一个从0开始的递增数组,因此第一页数据的前8位数字就是从0到7。而第二页的数据是1024~1027一共4个浮点数,占16个字节。所以我们在第二页第二次使用numpy.frombuffer()去读取数据的时候,得到的是一个空的数组。此外我们可以查看一下这个二进制文件的大小:

In [1]: import os

In [2]: os.path.getsize('/tmp/tmp.dat')
Out[2]: 4112

一共是4112个字节,刚好是4096+16个字节。

总结概要

本文介绍了一种在Python中将Numpy数组转存为一个紧凑的二进制格式的文件,及其使用内存映射的形式进行读取的方案。一个二进制的数据流,不仅可以更加方便页形式的内存映射,相比于传统的Numpy单精度浮点数数组还有一个可哈希的特性。总体来说是一个对于高性能计算十分友好的存储格式,在cudaSPONGE中作为一个分子动力学模拟轨迹输出的格式使用。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/dat.html

作者ID:DechinPhy

更多原著文章:https://www.cnblogs.com/dechinphy/

请博主喝咖啡:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

标签:tmp,存储,字节,Python,读写,二进制,PAGE,SIZE
From: https://www.cnblogs.com/dechinphy/p/18404896/dat

相关文章

  • python知识点100篇系列(13)-几种方法让你的电脑一直在工作
    写在前面:如果只想设置电脑永不息屏,可以在电脑的右下角,电源设置中的电源选项,设置成不熄灭屏幕即可;不需要依靠其他工具,但是这个也只能让电脑不息屏,其他也干不了;这里文章说的电脑一直在工作,是指使用python自动操作鼠标或键盘来使得电脑一直不息屏;第一种,可以使用pyautogui:......
  • python 创建虚拟环境
    使用python-venv可以创建一个独立的Python虚拟环境,方便管理项目依赖。以下是如何使用python-venv创建和激活虚拟环境的步骤:1.安装Pythonvenv模块大多数Python版本自带venv模块。如果没有,可以通过包管理工具安装:sudoaptinstallpython3-venv#在Ubuntu/Debia......
  • python画图|极坐标画图基础教程
    前述已经学习了直方图、3D图、实现图、散点图等多种图形画法,它们都位于常规的直角坐标系,今天我们尝试探索新的方法:极坐标画图。【1】官网教程按照惯例,还是乖乖打开官网教程,链接如下:https://matplotlib.org/stable/gallery/pie_and_polar_charts/polar_demo.html打开后我们......
  • 基于python+flask框架的月子会所管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着现代社会的快速发展和生活水平的提高,人们对母婴健康的重视程度日益增强。月子会所作为提供专业产后护理与恢复服务的机构,近年来在全球......
  • 基于python+flask框架的在线酒店管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和旅游业的蓬勃兴起,酒店行业正经历着前所未有的变革。传统酒店管理模式已难以满足市场快速响应和个性化服务的需......
  • 计算机毕业设计python健身房预约管理系统 27272
    目录技术栈和环境说明具体实现截图系统设计技术路线解决的思路python-flask核心代码部分展示python-django核心代码部分展示django项目结构讲解研究方法研究目的可行性分析论证源码获取技术栈和环境说明本系统以Python开发语言开发,MySQL为后台数据库,采用DJANGO/flas......
  • 计算机毕业设计python企业人事员工考勤管理系统 8bqti
    目录技术栈和环境说明具体实现截图系统设计技术路线解决的思路python-flask核心代码部分展示python-django核心代码部分展示django项目结构讲解研究方法研究目的可行性分析论证源码获取技术栈和环境说明本系统以Python开发语言开发,MySQL为后台数据库,采用DJANGO/flas......
  • 计算机毕业设计python助农捐赠服务平台的设计与实现 0k7459
    目录技术栈和环境说明具体实现截图系统设计技术路线解决的思路python-flask核心代码部分展示python-django核心代码部分展示django项目结构讲解研究方法研究目的可行性分析论证源码获取技术栈和环境说明本系统以Python开发语言开发,MySQL为后台数据库,采用DJANGO/flas......
  • 基于python+flask框架的社区居民信息管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,社区作为城市的基本单元,其管理与服务水平直接关系到居民的生活质量和社会稳定。传统的社区管理方式往往依赖于纸质档......
  • 基于python+flask框架的志羽·羽场管理与智能推荐系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着全民健身热潮的兴起,羽毛球作为一项广受欢迎的运动项目,其场地需求日益增长。然而,传统羽场管理模式面临着诸多挑战,如场地利用率不均衡、......