在 Python 中读取和切片二进制数据文件的最快方法

2023-12-25

我有一个处理脚本,旨在提取“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速度要快得多。

时间为struct.unpack, 没有np.array为 266 微秒;只是为了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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中读取和切片二进制数据文件的最快方法 的相关文章

  • pandas DataFrame.join 的运行时间是多少(大“O”顺序)?

    这个问题更具概念性 理论性 与非常大的数据集的运行时间有关 所以我很抱歉没有一个最小的例子来展示 我有一堆来自两个不同传感器的数据帧 我需要最终将它们连接成两个very来自两个不同传感器的大数据帧 df snsr1 and df snsr2
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 如何使用 Selenium 和 ChromeDriver 解决 TypeError: 'module' object is not callable 错误 [重复]

    这个问题在这里已经有答案了 代码试验 from selenium import webdriver from selenium webdriver chrome options import Options as Chromeoptions
  • Python 3:将字符串转换为变量[重复]

    这个问题在这里已经有答案了 我正在从 txt 文件读取文本 并且需要使用我读取的数据之一作为类实例的变量 class Sports def init self players 0 location name self players pla
  • Java 和 Python 可以在同一个应用程序中共存吗?

    我需要一个 Java 实例直接从 Python 实例数据存储中获取数据 我不知道这是否可能 数据存储是否透明 唯一 或者每个实例 如果它们确实可以共存 都有其单独的数据存储 总结一下 Java 应用程序如何从 Python 应用程序的数据存
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 嵌套作用域和 Lambda

    def funct x 4 action lambda n x n return action x funct print x 2 prints 16 我不太明白为什么2会自动分配给n n是返回的匿名函数的参数funct 完全等价的定义fu
  • 尽管我已在 python ctypes 中设置了信号处理程序,但并未调用它

    我尝试过使用 sigaction 和 ctypes 设置信号处理程序 我知道它可以与python中的信号模块一起使用 但我想尝试学习 当我向该进程发送 SIGTERM 时 但它没有调用我设置的处理程序 只打印 终止 为什么它不调用处理程序
  • 如何将 GAE 中一种 Kind 中的所有实体复制到另一种 Kind 中,而无需显式调用每个属性

    我们如何使用function clone entity 如中所述在 Python 中复制 Google App Engine 数据存储中的实体 而无需在 编译 时知道属性名称 https stackoverflow com question
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • 如何使用 Python 3 检查目录是否包含文件

    我到处寻找这个答案但找不到 我正在尝试编写一个脚本来搜索特定的子文件夹 然后检查它是否包含任何文件 如果包含 则写出该文件夹的路径 我已经弄清楚了子文件夹搜索部分 但检查文件却难倒了我 我发现了有关如何检查文件夹是否为空的多个建议 并且我尝
  • Protobuf 如何编码 oneof 消息结构

    对于这个 python 程序 在编码时运行 protobuf 编码会给出以下输出 0a 10 08 7f8a 0104 08 02 10 0392 0104 08 02 10 03 18 01 我不明白的是为什么8a后面有一个01 为什么9
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 如何在 Flask 中的视图函数/会话之间传递复杂对象

    我正在编写一个 Web 应用程序 当 且仅当 用户登录时 该应用程序从第三方服务器接收大量数据 这些数据被解析为自定义对象并存储在list 现在 用户在应用程序中使用这些数据 调用不同的视图 例如发送不同的请求 我不确定什么是最好的模式在视
  • pytest找不到模块[重复]

    这个问题在这里已经有答案了 我正在关注pytest 良好实践 https docs pytest org en latest explanation goodpractices html test discovery或者至少我认为我是 但是

随机推荐

  • Intellij 14 + lombok:@Slf4j 找不到符号日志

    Intellij 无法识别 SLF4J 注释 我有以下错误 Error 105 9 java cannot find symbol symbol variable log location class com xxxxx SdsConfig
  • 从groovy脚本加载脚本

    文件1 groovy def method println test 文件2 groovy method 我想在运行时加载 包含 File1 groovy 中的函数 方法 相当于 ruby s rake 的加载 它们位于两个不同的目录中 如
  • 如何在 Google Colab 中拆分代码单元?

    使用Jupyter Notebook我发现分割单元格的功能非常有用 我也想在 Google Colab 中执行此操作 但我找不到如何执行此操作 能做到吗 如果答案是肯定的 怎么办 我不知道如何通过菜单选择来完成此操作 但在 Jupyter
  • 使用 NetNamedPipe 的 WCF 多个应用程序

    我正在尝试在同一台计算机上运行多个 WCF 服务托管应用程序 我想运行多个应用领域 不在一个应用程序中提供多项服务 var host new ServiceHost typeof MyClass1 new Uri new Uri net p
  • redis-py 退出时不关闭线程

    我正在使用 redis py 2 10 6 和 redis 4 0 11 我的应用程序使用 redis 作为数据库和 pubsub 当我关闭时 我经常会遇到挂起或崩溃的情况 后者通常会抱怨处理 pubsub 回调时发生的错误文件描述符或文件
  • Access 中的多个 LEFT JOIN

    我有以下查询 适用于 MySQL DELETE test1 test2 test3 test4 FROM test1 LEFT JOIN test2 ON test2 qid test1 id LEFT JOIN test3 ON test
  • PHP中如何检查IP地址是否在两个IP范围内?

    我有一个 IP 地址 并且还获得了另外两个 IP 地址 它们一起创建了一个 IP 范围 我想检查第一个IP地址是否在这个范围内 我怎样才能在 PHP 中找到它 With ip2long http php net manual en func
  • 自定义单选ListView

    我想制作一个自定义列表视图 在一行中具有两个 TextView 和一个单选按钮 在列表项上单击单选按钮状态应为切换 我不能在这里使用简单适配器 我已经问过这个问题了单选ListView自定义Row Layout https stackove
  • Android 工具栏仅在 AppBarLayout 折叠时显示标题和副标题

    我有 AppBarLayout CollapsingToolbarLayout 和工具栏的活动 从代码中设置标题和副标题 最初我希望工具栏隐藏并在应用栏布局折叠时显示 使用我的代码 它可以工作 工具栏最初隐藏 但它始终显示工具栏标题和副标题
  • 合并 MongoDB 聚合中的数组字段

    使用 MongoDB 聚合框架时是否可以合并数组字段 这是我试图解决的一个摘要问题 用于聚合的示例输入文档 Category 1 Messages Msg1 Msg2 Value 1 Category 1 Messages Value 10
  • 使用 UNC 路径的 Windows 8 StorageFile.GetFileFromPathAsync

    有没有人曾经设法使用 Windows 8 应用程序将文件从 unc 目录复制到本地目录 根据这里的官方文档 http msdn microsoft com en us library windows apps hh967755 aspx 可
  • 如何在 C# 中解密由 PHP 中的 mcrypt 加密的加密 MCRYPT_RIJNDAEL_256 值?

    我正在尝试从 Linux 端管理的数据库表中读取 Base64 编码的值 在那里面 表中有一个名为first name 的列 在 Linux 端 我可以通过在 PHP 中使用以下命令轻松解密 data mcrypt decrypt MCRY
  • C++11 - 编译时多态解决方案

    假设我正在编写一个跨平台库 我必须以不同平台有不同行为的方式组织代码 并且这种行为 或定义 是在编译时根据我的库所在的平台选择的正在编译中 在 C 中执行此操作的 通常 方法是用大量的内容污染代码 ifdef当编写方法或类时 方法的问题在于
  • UTF16 十六进制转文本

    我有 UTF 16 十六进制表示形式 例如 0633064406270645 它是阿拉伯语中的 S 我想将其转换为其等效文本 在 PostgreSQL 中有直接的方法可以做到这一点吗 我可以像下面这样转换 UTF 代码点 不幸的是 似乎不支
  • F# 类型提供程序构建非常非常慢

    我正在使用类型提供程序 特别是 sql 实体框架类型提供程序 我正在针对一个包含大量对象的数据库编写测试 并且它是远程的 因此连接有点慢 每次我构建项目都会花费很多时间 需要几分钟才能完成构建 我缺少什么为什么编译器不缓存类型信息 附 使用
  • lxml.etree、element.text 不返回元素的整个文本

    我通过 xpath 废弃了一些 html 然后将其转换为 etree 与此类似的东西 td text1 a link a text2 td 但是当我调用 element text 时 我只得到 text1 它必须在那里 当我在 FireBu
  • laravel 从模型生成数据库

    我正在使用 Laravel 的现有项目 并且该现有项目已经有模型 这里是一个示例
  • DVTCoreSimulatorAdditionsErrorDomain Xcode 10GM

    当我将Xcode更新到Version 10 GM时 构建成功 但模拟器无法工作 有错误 操作无法完成 DVTCoreSimulatorAdditionsErrorDomain 错误 0 run xcrun simctl erase all在
  • 如何在mysql中为不同的字符长度添加前导零?

    您好 我对不同的表有一个查询 并且所有表都有不同的长度 这需要前导零ID 是否可以使用一个查询向任何表添加前导零 假设第一个查询是insert to tbl1 field1 CHAR 3 001 那么下一个查询是insert to tbl2
  • 在 Python 中读取和切片二进制数据文件的最快方法

    我有一个处理脚本 旨在提取 uint16 类型的二进制数据文件 并一次以 6400 块为单位进行各种处理 该代码最初是用 Matlab 编写的 但由于分析代码是用 Python 编写的 因此我们希望通过在 Python 中完成所有操作来简化