我想在硬盘上的一个大的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))
对于int32
byte_size=32/8
对于int16
byte_size=16/8
等等...
如果尺寸是恒定的,则可以在一个2D阵列像加载数据:
shape = (total_length/size,size)
data = np.memmap('tmp', dtype='i', mode='r+', order='F', shape=shape)
您可以更改memmap
只要你想要的对象。 它甚至可以使阵列共享相同的元素。 在这种情况下,在一个所做的更改在其它自动更新。
其他参考资料: