使用python读取大型二进制文件(>;2GB)

使用python读取大型二进制文件(>;2GB),python,binaryfiles,Python,Binaryfiles,我正在写一个程序来处理一些二进制文件。 我以前使用的是numpy.fromfile,在我遇到一些大的二进制文件(>2gb)之前,一切都很好,因为我不知道如何将我的文件转换为h5文件,尝试h5py失败后,numpy无法读取它们(内存问题)。我试图使用< C++ >(代码> >读()/代码>和结构> unPcPys< ,以便重构数据,如我在C++中所做的。 我的二进制文件表示32位浮点,这些浮点将配对为64位复数 目前的问题是,即使从我收集的信息struct.unpack_from()返回一个元组,

我正在写一个程序来处理一些二进制文件。 我以前使用的是
numpy.fromfile
,在我遇到一些大的二进制文件(>2gb)之前,一切都很好,因为我不知道如何将我的文件转换为h5文件,尝试h5py失败后,numpy无法读取它们(内存问题)。我试图使用< C++ >(<代码)>代码> >读()/代码>和<代码>结构> unPcPys< <代码>,以便重构数据,如我在C++中所做的。

我的二进制文件表示32位浮点,这些浮点将配对为64位复数

目前的问题是,即使从我收集的信息
struct.unpack_from()
返回一个元组,其中包含文件中指定类型的所有数据,它也只返回文件的第一个元素:

守则:

f1 = open(IQ_File, 'rb')
a1 = f1.read()       
f = struct.unpack_from('f', a1)
print(f)
我在这里期望的是二进制返回浮点的输出,但是我的输出只是:

(-0.057812511920928955,)
--仅包含文件的第一个浮点的元组

我真的不明白我做错了什么。 我应该怎么做呢?

从('f',data)解包
数据中读取一个浮点数。您可能正在寻找

iter_解包(“f',a1”)中f的
:
印刷品(a1)
您可以通过在单独的循环中只读取少量文件(例如,一次64Kb)来提高效率。

unpack\u from('f',data)
数据中读取单个浮点数。您可能正在寻找

iter_解包(“f',a1”)中f的
:
印刷品(a1)

您可以通过在单独的循环中只读取少量文件(例如,一次64Kb)来提高效率。

打包/解包格式字符串可以在每个项目前面加上一个数字,以打包/解包这么多的项目。只需将数据大小除以
float
的大小,并将该数字的格式为:

nf = len(a1) // struct.calcsize('f')
f = struct.unpack(f"{nf}f", a1)
请注意,元组是在Python中存储数字数组数据的非常无效的方法。在使用CPython的64位系统(例如macOS)上,一个
N
浮点元组使用
24+N*8
字节(
sizeof(PyObject\u VAR\u HEAD)
+
N
指针)作为元组本身加上
N*24
字节(
sizeof(PyObject\u HEAD)
+one
double
)作为双字节存储在内部,或总共
24+N*32
字节。这是二进制数据大小的8倍

更好的选择是使用
numpy.fromfile()
并显式提供
count
和可能的
offset
参数,以便以块的形式读取文件。如果您需要提前知道文件中总共有多少个浮点数,请使用
os.stat()


打包/解包格式字符串可以在每个项目前面加上一个数字,以便打包/解包这么多的项目。只需将数据大小除以
float
的大小,并将该数字的格式为:

nf = len(a1) // struct.calcsize('f')
f = struct.unpack(f"{nf}f", a1)
请注意,元组是在Python中存储数字数组数据的非常无效的方法。在使用CPython的64位系统(例如macOS)上,一个
N
浮点元组使用
24+N*8
字节(
sizeof(PyObject\u VAR\u HEAD)
+
N
指针)作为元组本身加上
N*24
字节(
sizeof(PyObject\u HEAD)
+one
double
)作为双字节存储在内部,或总共
24+N*32
字节。这是二进制数据大小的8倍

更好的选择是使用
numpy.fromfile()
并显式提供
count
和可能的
offset
参数,以便以块的形式读取文件。如果您需要提前知道文件中总共有多少个浮点数,请使用
os.stat()


numpy.fromfile
实际上也适用于大型二进制文件。您可以设置
count
参数来告诉numpy它应该读取多少字节。如果你想分块读取文件,这很有用。实际上我需要读取整个文件,而不是分块,因为我需要用时间图来表示它。遗憾的是,使用numpy.fromfile(“myfile”,np.complex64)会导致:MemoryError***检测到引用计数错误:试图解除分配14(F)***这与如何读取文件无关。如果它对你的记忆来说太大,那么你必须处理它。通常,您所做的是只打开其中的一部分,并将其分块处理
struct
不会改变这一点。我认为内存没有问题,因为open()和read()实际上可以访问文件(所以现在我打开了文件,并在程序运行时另存为二进制文件),现在我需要的是将所有字节高效地转换为32位浮点,并将它们以复杂方式分组。如果我在C或C++,我的解决方案是打开并分配到堆上,以确保有足够的空间,这是基本的,我不知道Python和NuMPy是如何工作的,所以我不知道它们在哪里分配东西,但是我认为类似于我在C++中应该做的事情应该是有可能的,然后,我是否可以强制它或使用不同的模块在堆上分配它?我甚至不知道这在python上是否可行,因为我不能使用指针。正如我所说,我对它没有经验,我很少使用这种语言,再次感谢你。
numpy.fromfile
实际上也应该适用于大型二进制文件。您可以设置
count
参数来告诉numpy它应该读取多少字节。如果你想分块读取文件,这很有用。实际上我需要读取整个文件,而不是分块,因为我需要用时间图来表示它。遗憾的是,使用numpy.fromfile(“myfile”,np.complex64)会导致:MemoryError***检测到引用计数错误:试图解除分配14(F)***这与如何读取文件无关。如果它对你的记忆来说太大,那么你必须处理它。通常,您所做的只是打开零件