Python 有效读取二进制文件中的值
我有很多包含数值模型输出的二进制文件。它们是以浮点数形式包含输出的平面二进制文件。这些文件对应于按t-z-y-x顺序排序的四维数组,x变化最快。问题是,对于给定的x,y和z,我需要所有t的值。简单的解决方案是将所有内容读入一个大的numpy数组并获取Python 有效读取二进制文件中的值,python,Python,我有很多包含数值模型输出的二进制文件。它们是以浮点数形式包含输出的平面二进制文件。这些文件对应于按t-z-y-x顺序排序的四维数组,x变化最快。问题是,对于给定的x,y和z,我需要所有t的值。简单的解决方案是将所有内容读入一个大的numpy数组并获取数据[:,z,y,x]当然可以,但效率不是很高(我需要读取许多文件) 我现在想到的是以下内容(假设start\u index和volume\u size表示正确的内容): 我不必担心终端性和可移植性(尽管后者当然有一些优点)。整个程序都是在Linux
数据[:,z,y,x]
当然可以,但效率不是很高(我需要读取许多文件)
我现在想到的是以下内容(假设start\u index
和volume\u size
表示正确的内容):
我不必担心终端性和可移植性(尽管后者当然有一些优点)。整个程序都是在Linux上运行的,它不太可能在其他系统上运行。所以问题是:有没有一种更高性能的方法可以做到这一点?这是在许多文件上完成的。我尝试了并行化,但没有真正的帮助。获取新硬件不是一种选择,SSD由于涉及的数据量更是如此。两者都没有改变文件格式。可能的选项包括
数组.fromfile()
再次浏览之后,您可以省略StringIO
内容,改用array.fromstring()
仅使用一次读取(或少量读取)通常应比重复的
infle.seek()
和data.fromfile(infle,1)
调用更快,尤其是在每次调用仅读取一个值的情况下。(除非你的步长(volume\u size
)足够大——跳过几百到几千个字节——那么按你的方式做可能会更快……如果我是你,我会看一看。过去,我用它来解决与您类似的问题,效果很好。我还没有掌握mmap的窍门,也不知道StringIO的用途。也许你可以详细说明一下?根据我的经验,读取整个文件的速度较慢。这些文件不是很大(大约10MB),但我可能需要处理数千个文件。为了更精确,编辑了我的答案。谢谢。我会调查的。关键是,我使用infle.seek()跳过了大约半兆字节,所以是的,我的步长非常大。因此您有大约20个read()
调用,每个调用读取几个字节。在这种情况下,忘了我写的东西吧——你的方法应该更快。试过之后,我的方法稍微有点优势并不重要。这让我产生了这样的假设:我或多或少是在尽我所能做到最好。谢谢你的解释,这很有趣。谢谢。这似乎不是更快,而是生成更好的代码。
data=array.array('f')
with file(my_filename,'rb') as infile:
for hour in range(amount_of_steps):
if hour==0:
infile.seek(start_index*data.itemsize,0)
else:
infile.seek(data.itemsize*volume_size,1)
data.fromfile(infile,1)