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

Python存储与读写二进制文件

时间:2024-09-14 16:23:20浏览次数:12  
标签:tmp 存储 Python 读写 二进制 格式 PAGE SIZE


Python存储与读写二进制文件_内存映射

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

技术背景

一般情况下我们会选择使用明文形式来存储数据,如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中作为一个分子动力学模拟轨迹输出的格式使用。


作者ID:DechinPhy


标签:tmp,存储,Python,读写,二进制,格式,PAGE,SIZE
From: https://blog.51cto.com/u_15561675/12017746

相关文章

  • 避免 PyCharm 将该 Python 脚本作为测试运行
    为了避免PyCharm将该Python脚本作为测试运行(即pytest自动捕获),你可以做以下几步来确保该脚本作为普通的Python程序执行,而不是作为pytest运行。解决方案:1.确保文件名不以test_开头:Pytest会自动检测以test_开头的文件,并尝试将其作为测试运行。如果你的文件名是test_m......
  • typer python cli 开发框架
    typer是一个基于pythontypehints的快速强大的cli开发框架,由fastapi框架的作者开发,是一个很不错的工具包含的特性使用简单简单支持开发复杂cli可以执行运行script参考使用安装python-mvenvvenvsourcevenv/bin/activatepipinstalltyper简单使用defmain(name:str):......
  • 鼓励读写结合
    在语文学科的教学中,教师要以培养学生的语文核心素养为切入点,以古诗词为载体设计写作环节,强化学生的古诗词阅读体验,引导学生将阅读体验写下来,提高学生写作的主动性和积极性,开发学生思维。以《枫桥夜泊》这首古诗为例,教师可组织开展“古诗新写”的教学活动,引导学生在阅读《枫桥夜泊......
  • python数据分析与可视化
    Python是进行数据分析和可视化的强大工具。它提供了丰富的库和框架来帮助数据科学家和分析师处理数据集、执行统计分析以及创建交互式图表。以下是一些常用的库以及它们的基本用法。数据处理库Pandas:Pandas是Python中最流行的数据分析库之一,它提供了数据结构和数......
  • 代数模型(Algebraic Models)---线性规划------+ 案例 + Python源码求解(见文中)
    目录一、代数模型(AlgebraicModels)详解1.1什么是代数模型?1.2代数模型的基本形式1.3安装所需要的Python包--运行下述案例1.4代数模型的应用案例案例1:市场供需平衡模型Python求解代码Python求解结果如下图:案例2:运输问题中的线性规划模型进行数学建模分析1.目标函数2.......
  • python https 下载文件
    同步下载defdownload_file_block(url:str,file_path:str):logging.basicConfig(level=logging.DEBUG)log=logging.getLogger('requests.packages.urllib3')log.setLevel(logging.DEBUG)log.propagate=TrueclassDebugAdapter(HTTPAd......
  • Python数据分析与可视化基础教程
    Python数据分析与可视化基础教程一、引言Python是一种功能强大的编程语言,广泛应用于数据科学、机器学习、Web开发等领域。在数据分析与可视化方面,Python提供了丰富的库和工具,可以帮助我们轻松地处理数据、提取有用信息,并将结果以直观的方式展示出来。本教程将介绍Python......
  • *Python*机器学习算法——线性回归(Linear Regression)
    目录⭐️引言⭐️理论1、 简单线性回归2、 多元线性回归3、最佳拟合⭐️结语⭐️引言        线性回归(LinearRegression)是一种基本的预测分析方法,它通过拟合数据点来建立因变量(目标变量)与一个或多个自变量之间的关系模型。线性回归假设这种关系是线性的,并试图找到......
  • 如何使用【Python】快速制作可视化报表
    数据可视化能力已经越来越成为各岗位的基础技能。领英的数据报告显示,数据可视化技能在2017年中国最热门技能中排名第一。就数据分析而言,可视化探索几乎是你正式进行数据分析的第一步,通过SQL拿到数据之后,我们需要使用可视化方法探索和发现数据中的模式规律。数据分析界有一......
  • YOLOV5 onnx推理 python
      pipinstallonnxcoremltoolsonnx-simplifier 3.使用onnx-simplier简化模型python-monnxsimbest.onnxbest-sim.onnx #coding=utf-8importcv2importnumpyasnpimportonnxruntimeimporttorchimporttorchvisionimporttimeimportrandomfromutil......