使用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)
+onedouble
)作为双字节存储在内部,或总共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)
+onedouble
)作为双字节存储在内部,或总共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)***这与如何读取文件无关。如果它对你的记忆来说太大,那么你必须处理它。通常,您所做的只是打开零件