Syr*_*jor 8 python arrays fortran numpy hdf5
我想将硬盘上的大型Fortran记录(12G)映射到numpy数组.(映射而不是加载以节省内存.)
存储在fortran记录中的数据不是连续的,因为它除以记录标记.记录结构为"标记,数据,标记,数据,......,数据,标记".数据区域和标记的长度是已知的.
标记之间的数据长度不是4个字节的倍数,否则我可以将每个数据区域映射到数组.
可以通过在memmap中设置偏移来跳过第一个标记,是否可以跳过其他标记并将数据映射到数组?
为可能的模糊表达道歉并感谢任何解决方案或建议.
5月15日编辑
这些是fortran无格式文件.存储在记录中的数据是(1024 ^ 3)*3 float32数组(12Gb).
大小超过2千兆字节的可变长度记录的记录布局如下所示:

(有关详细信息,请参阅此处 - > [记录类型] - > [可变长度记录]部分.)
在我的情况下,除了最后一个,每个子记录的长度为2147483639字节,相隔8个字节(如上图所示,前一个子记录的结束标记和后一个子标记的开始标记,8个字节)总计).
我们可以看到第一个子记录以某个浮点数的前3个字节结束,第二个子记录以其余的1个字节开始,如2147483639 mod 4 = 3.
我发布了另一个答案,因为对于此处给出的示例 numpy.memmap有效:
offset = 0
data1 = np.memmap('tmp', dtype='i', mode='r+', order='F',
offset=0, shape=(size1))
offset += size1*byte_size
data2 = np.memmap('tmp', dtype='i', mode='r+', order='F',
offset=offset, shape=(size2))
offset += size1*byte_size
data3 = np.memmap('tmp', dtype='i', mode='r+', order='F',
offset=offset, shape=(size3))
Run Code Online (Sandbox Code Playgroud)
对于int32 byte_size=32/8,对于int16 byte_size=16/8等等......
如果大小是恒定的,您可以将数据加载到二维数组中,如下所示:
shape = (total_length/size,size)
data = np.memmap('tmp', dtype='i', mode='r+', order='F', shape=shape)
Run Code Online (Sandbox Code Playgroud)
您可以memmap根据需要更改对象。甚至可以使数组共享相同的元素。在这种情况下,其中一个中所做的更改会在另一个中自动更新。
其他参考: