我有一个处理脚本,用于提取“uint16”类型的二进制数据文件,并一次以6400块的形式进行各种处理.该代码最初是用Matlab编写的,但由于分析代码是用 Python编写的,我们希望通过在Python中完成所有工作来简化流程.问题是我注意到我的Python代码比Matlab的fread函数慢得多.

简单地说,Matlab代码是这样的:

fid = fopen(filename);

frame = reshape(fread(fid,80*80,'uint16'),80,80);

虽然我的Python代码很简单:

with open(filename, 'rb') as f:

frame = np.array(unpack("H"*6400, f.read(12800))).reshape(80, 80).astype('float64')

文件大小从500 MB变化很大 – > 400 GB所以我相信找到一种更快的方法来解析Python中的数据可以为较大的文件带来好处. 500 MB通常具有~50000个块,并且该数量随文件大小线性增加.我看到的速度差异大致是:

Python = 4 x 10^-4 seconds / chunk

Matlab = 6.5 x 10^-5 seconds / chunk

处理显示随着时间的推移,Matlab比我实现的Python方法快约5倍.我已经探索了诸如numpy.fromfile和numpy.memmap之类的方法,但是因为这些方法需要在某些时候将整个文件打开到内存中,所以它限制了用例,因为我的二进制文件非常大.有没有一些pythonic方法可以做到这一点,我错过了?我本以为Python在打开阅读二进制文件方面会非常快.任何意见是极大的赞赏.

最佳答案 将块写入文件:

In [117]: dat = np.random.randint(0,1028,80*80).astype(np.uint16)

In [118]: dat.tofile('test.dat')

In [119]: dat

Out[119]: array([266, 776, 458, ..., 519, 38, 840], dtype=uint16)

按您的方式导入:

In [120]: import struct

In [121]: with open('test.dat','rb') as f:

...: frame = np.array(struct.unpack("H"*6400,f.read(12800)))

...:

In [122]: frame

Out[122]: array([266, 776, 458, ..., 519, 38, 840])

使用fromfile导入

In [124]: np.fromfile('test.dat',count=6400,dtype=np.uint16)

Out[124]: array([266, 776, 458, ..., 519, 38, 840], dtype=uint16)

比较时间:

In [125]: %%timeit

...: with open('test.dat','rb') as f:

...: ...: frame = np.array(struct.unpack("H"*6400,f.read(12800)))

...:

1000 loops, best of 3: 898 µs per loop

In [126]: timeit np.fromfile('test.dat',count=6400,dtype=np.uint16)

The slowest run took 5.41 times longe....

10000 loops, best of 3: 36.6 µs per loop

fromfile要快得多.

没有np.array的struct.unpack的时间是266μs;仅仅是f.read,23.所以它是unpack加上更通用和更健壮的np.array需要更长的时间.文件读取本身不是问题. (np.array可以处理多种输入,列表列表,对象列表等,因此必须花费更多时间来解析和评估输入.)

fromfile上稍微快一点的变体是你的读取加上frombuffer:

In [133]: with open('test.dat','rb') as f:

...: frame3 = np.frombuffer(f.read(12800),dtype=np.uint16)

python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...相关推荐

  1. java 从excel中读取数据_在Java中读取Excel文件的内容和导出数据到Excel文件中

    转自www.chianjavaworld.net 原作者:SonyMusic 读:rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr 在Java ...

  2. python链表删除尾部节点_python单链表中如何查找和删除节点?

    在之前的文章[python单链表中如何插入和输出节点?]中给大家介绍了单链表是什么,以及如何进行添加节点.输出所以节点.下面本篇文章给大家介绍如何查找和删除节点,希望对大家有所帮助. 如何从单链表中查 ...

  3. python批量删除微信好友_用 Python + Appium 的方式自动化清理微信僵尸好友

    随着微信的使用时间越长,微信好友也越来越多,有些好友将你删除了你也不知道.当我们发消息的时候会出现下面扎心的一幕,然后默默将他删除 使用 Appium 基础的 appium 使用在公众号文章 < ...

  4. java删除csv一行_在Java中读取CSV文件时跳过第一行

    嘿家伙我正在编写解析器代码来读取.csv文件并将其解析为 XML.这是我的代码,它工作正常,但我希望它跳过文件中的第一行.所以我决定设置一个HashMap,但它似乎确实有效: for (int i = ...

  5. python读取hadoop库数据_使用Python访问HDFS

    最近接触到大数据,对于Skpark和Hadoop的料及都停留在第一次听到这个名词时去搜一把看看大概介绍免得跟不上时代的层次. 在实际读了点别人的代码,又自己写了一些之后,虽然谈不上理解加深,至少对于大 ...

  6. python开发的程序中以电子表格显示数据_使用 Python 读取电子表格中的数据实例详解...

    Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...

  7. python爬取豆瓣短评_用python实现豆瓣短评通用爬虫(登录、爬取、可视化分析)

    原创技术公众号:bigsai 前言 在本人上的一门课中,老师对每个小组有个任务要求,介绍和完成一个小模块.工具知识的使用.然而我所在的组刚好遇到的是python爬虫的小课题. 心想这不是很简单嘛,搞啥 ...

  8. oracle从mysql抓数据_关于oracle数据库读取数据的三种方式

    打开oracle sqldeveloper,连接到HR模式下的数据库,在SQL工作表中,执行如下语句: CREATE TABLE WANG( Name  varchar2(6), ID     num ...

  9. QFile和C语言对文件操作的性能比较.--读取double型二进制数据文件

    关键问题在于:QFile读取double型二进制数据流,只有两种方法处理数值. 一是通过QDataStream一个一个double读取,存储在一个QVector<double>中 二是通过 ...

最新文章

  1. 运维企业专题(4)LVS高可用与负载均衡前篇——先学原理,再学配置
  2. @RestController和@Controller区别
  3. ubuntu Ulipad 配置
  4. 海康威视:国际化+互联网 公司迎来“第二春”
  5. Vue的列表渲染指令
  6. python随机取列表元素_python random从集合中随机选择元素
  7. Utils.toDip()的用法
  8. 基于FPGA的FFT设计
  9. 程序员效率:职业倦怠的理解
  10. 常用字符串处理函数汇总
  11. LeetCode 131. 分割回文串(回溯)
  12. Oracle数据库迁移测试数据,Oracle数据库的数据迁移方法
  13. 10个业界最流行的Kubernetes发行版
  14. php搭建云服务器,云服务器上如何搭建php环境
  15. Tornado快速入门
  16. UnityShader4:UnityShader的形式
  17. 解决wordpress前后台非常卡的几个方法
  18. Conficker.AE病毒局域网扫描工具
  19. request.getParameterValues()
  20. WeaveSocket框架-Unity太空大战游戏-客户端-3

热门文章

  1. oracle 根据分隔符提取,oracle使用指定分隔符导出数据到文件
  2. ajax实现重新绘图,如何画Flot AJAX更新图
  3. 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
  4. python和pytorch是什么关系_【PyTorch】Tensor和tensor的区别
  5. 复制带随机节点的链表
  6. Java加密与解密的艺术~安全协议~单向认证服务
  7. 怎么实现java和数据库的链接_JAVA简单链接Oracle数据库,实现注册和登陆的功能
  8. java 耦合度_Java第三十八天,Spring框架系列,使用工厂模式降低程序耦合度
  9. 协议簇:TCP 解析: Sequence Number
  10. [数据库] --- clickhouse