Python存储与读写二进制文件的示例代码

 更新时间:2024年09月10日 09:30:02   作者:DECHIN  
本文介绍了如何在Python中使用Numpy将数组转存为二进制文件,并通过内存映射的方式读取,提供了一个高效处理大量数据的方法,示例代码展示了完整的存储和读取过程,解释了页大小和数据存储的关系,适用于需要高性能计算和数据压缩的场景,感兴趣的朋友跟随小编一起看看吧

技术背景

一般情况下我们会选择使用明文形式来存储数据,如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

到此这篇关于Python存储与读写二进制文件的文章就介绍到这了,更多相关Python读写二进制文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python简单实现图片文字分割

    python简单实现图片文字分割

    这篇文章主要为大家详细介绍了python简单实现图片文字分割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python hashlib模块的使用示例

    Python hashlib模块的使用示例

    这篇文章主要介绍了Python hashlib模块的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10
  • python 实现目录复制的三种小结

    python 实现目录复制的三种小结

    今天小编就为大家分享一篇python 实现目录复制的三种小结,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • python mysql断开重连的实现方法

    python mysql断开重连的实现方法

    这篇文章主要介绍了python mysql断开重连的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Matlab常用的输出命令disp与fprintf解读

    Matlab常用的输出命令disp与fprintf解读

    这篇文章主要介绍了Matlab常用的输出命令disp与fprintf解读,具有很好的参考价值,希望对大家有所帮助。
    2022-12-12
  • Python 给定的经纬度标注在地图上的实现方法

    Python 给定的经纬度标注在地图上的实现方法

    今天小编就为大家分享一篇Python 给定的经纬度标注在地图上的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python hashlib模块详细讲解使用方法

    Python hashlib模块详细讲解使用方法

    hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512. 另外,模块中所定义的 new(name, string=”) 方法可通过指定系统所支持的hash算法来构造相应的hash对象
    2022-11-11
  • Python实现获取某天是某个月中的第几周

    Python实现获取某天是某个月中的第几周

    这篇文章主要介绍了Python实现获取某天是某个月中的第几周,本文代码实现获取指定的某天是某个月中的第几周、周一作为一周的开始,需要的朋友可以参考下
    2015-02-02
  • Python使用Selenium进行Web自动化测试

    Python使用Selenium进行Web自动化测试

    Selenium 是一个用于 Web 应用自动化测试的强大工具,可以用来模拟用户操作浏览器,从而测试 Web 应用的功能,它支持多种浏览器和编程语言,包括 Python,下面我们将介绍如何使用 Selenium 进行 Web 自动化测试,需要的朋友可以参考下
    2024-08-08
  • 深入理解python虚拟机生成器停止背后原理

    深入理解python虚拟机生成器停止背后原理

    这篇文章主要介绍了python虚拟机生成器停止背后原理深入详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10

最新评论