当前位置: 首页 > 面试题库 >

提高从二进制文件读取和转换的速度?

司徒钱青
2023-03-14
问题内容

我知道以前有一些关于文件读取,二进制数据处理和整数转换的问题struct,所以我来这里询问我有一段代码,我认为这花费了太多时间。所读取的文件是多通道数据样本记录(短整数),具有插入的数据间隔(因此有嵌套for语句)。代码如下:

# channel_content is a dictionary, channel_content[channel]['nsamples'] is a string
for rec in xrange(number_of_intervals)):
    for channel in channel_names:
        channel_content[channel]['recording'].extend(
            [struct.unpack( "h", f.read(2))[0]
            for iteration in xrange(int(channel_content[channel]['nsamples']))])

使用此代码,使用具有2Mb RAM的双核,每兆字节读取2.2秒,并且我的文件通常具有20+
Mb,这会带来一些非常令人讨厌的延迟(特别是考虑到另一个我试图镜像加载文件的基准共享软件程序)更快)。

我想知道的是:

  1. 如果存在违反“良好做法”的情况:循环安排不当,重复操作所需的时间超过必要,使用效率低下的容器类型(字典?)等。
  2. 如果此读取速度正常,或对于Python正常,并且读取速度
  3. 如果创建C ++编译的扩展,则可能会提高性能,并且是推荐的方法。
  4. (当然)如果有人建议对此代码进行一些修改,最好是基于以前对类似操作的经验。

谢谢阅读

(我已经发布了有关我的这项工作的一些问题,我希望它们在概念上都无关紧要,并且我也希望不要过于重复。)

编辑: channel_names是一个列表,所以我进行了@eumiro建议的更正(删除错字括号)

编辑:
我目前正接受塞巴斯蒂安(Sebastian)建议使用arraywithfromfile()方法,并将很快将最终代码放在此处。此外,每一次竞争对我都非常有用,我非常高兴地感谢每个回答的人。

完成array.fromfile()一次之后的最终形式,然后通过对大数组进行切片来为每个通道交替扩展一个数组:

fullsamples = array('h')
fullsamples.fromfile(f, os.path.getsize(f.filename)/fullsamples.itemsize - f.tell())
position = 0
for rec in xrange(int(self.header['nrecs'])):
    for channel in self.channel_labels:
        samples = int(self.channel_content[channel]['nsamples'])
        self.channel_content[channel]['recording'].extend(
                                                fullsamples[position:position+samples])
        position += samples

通过一次读取文件或以任何形式使用文件,速度的提高 非常 令人印象深刻struct


问题答案:

您可以array用来读取数据:

import array
import os

fn = 'data.bin'
a = array.array('h')
a.fromfile(open(fn, 'rb'), os.path.getsize(fn) // a.itemsize)

它比快40个倍struct.unpack从@samplebias的答案。

如果文件只有20-30M,为什么不读取整个文件,在一次调用中将数字解码unpack,然后通过遍历数组在通道之间分配它们:

data = open('data.bin', 'rb').read()
values = struct.unpack('%dh' % len(data)/2, data)
del data
# iterate over channels, and assign from values using indices/slices

快速测试显示,这使struct.unpack('h', f.read(2))20M文件的速度提高了10倍。



 类似资料:
  • 问题内容: 我正在尝试从URLConnection读取二进制文件。当我使用文本文件对其进行测试时,它似乎可以正常工作,但对于二进制文件则不能。发送文件时,我在服务器上使用以下mime类型: 但是到目前为止,似乎没有任何效果。这是我用来接收文件的代码: 问题答案: 我就是这样

  • 所以。。。我需要从.pkl文件中读取并导入图像数据集。图像存储为“二进制blob”。一旦完成了,我需要将它们转换成字节格式,这样我就可以通过Google的CloudVision运行它们。我设法在Linux虚拟机上打开了该文件(花了几天时间试图让它在Windows上工作…)。但现在我似乎无法将这个“二进制斑点”转换为我可以使用的实际图像。。。 下面是一个“二进制blob”: \1\x0 0 0 0\

  • 与malloc'相同大小的内存和手动读取整个文件到malloc'区域相比,这有什么不同?

  • 问题内容: 我有一个较长的无符号整数文件(每个64位,0.47GB文件),需要读取并存储在数组中。经过一番思考之后,由于Java中的所有内容都已签名(请纠正我,请纠正我),因此我长时间使用了该类型,我想不出更好的选择了。无论如何,仅需对数组进行排序,因此原始数字的精确值并不是最重要的。我们应该测量排序算法的效率,仅此而已。但是,当我实际要读取文件时(在下面的代码中),我遇到了砖墙。 它会一直持续下

  • 问题内容: 我发现用Python读取二进制文件特别困难。你能帮我个忙吗?我需要读取此文件,在Fortran 90中,该文件很容易被读取 详细而言,文件格式为: 如何使用Python阅读?我尝试了一切,但没有成功。我是否有可能在python中使用f90程序,读取此二进制文件,然后保存需要使用的数据? 问题答案: 读取二进制文件内容,如下所示: 然后使用struct.unpack “解压缩”二进制数据

  • 问题内容: 如何将文件转换为二进制文件?我的项目只需要它。我需要通过二进制文件加密文件。 问题答案: 如果您要访问ACTUAL BINARY形式,则读入文件并将每个字节转换为二进制表示形式… 编辑: 以下是一些代码,可将字节转换为带有位的字符串: 如果要访问文件中的字节,则只需使用以下代码(在第一种情况下也可以使用此代码): 要使用这两段代码,您现在可以遍历每个字节并使用以下位创建一个String