是否有可能在磁盘上discontiuous数据映射到与Python的数组?(Is it possib

2019-09-02 18:51发布

我想在硬盘上的一个大的FORTRAN记录(12G)映射到numpy的阵列。 (映射而不必加载用于保存存储器。)

因为它是由记录标记划分存储在FORTRAN记录中的数据是不连续的。 记录结构为“标记,数据,标记,数据,...,数据,标记”。 数据区和标记的长度是已知的。

标记之间的数据的长度是不倍数的4个字节,否则我可以将每个数据区域映射到一个数组。

第一标记可以通过在MEMMAP设定偏移,被跳过,是有可能跳过其他标记和数据映射到一个数组?

道歉可能含糊表达和感谢任何溶液或建议。


编辑5月15日

这是FORTRAN未格式化的文件。 存储在记录中的数据是(1024 ^ 3)* 3 FLOAT32阵列(12GB)。

的可变长度记录是大于2千兆字节的记录布局显示如下:

(详情请参见此处 - >段[记录类型] - > [可变长度记录])

在我的情况下,除了最后一个,每个子记录具有2147483639个字节的长度,并通过8个字节分离(如你在图中看到的上方,前一子记录的结束标记和一个开始以下一个,8个字节的标记在总)。

我们可以看到第一子记录与前3个字节某些浮点数的端部和所述第二子记录,其余的1个字节作为2147483639 MOD 4 = 3开始。

Answer 1:

我张贴了另一个答案,因为这里给出的例子 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只要你想要的对象。 它甚至可以使阵列共享相同的元素。 在这种情况下,在一个所做的更改在其它自动更新。

其他参考资料:

  • 在Python和numpy的大数据工作,没有足够的RAM,如何保存到光盘的部分结果?

  • numpy.memmap文档在这里 。



文章来源: Is it possible to map a discontiuous data on disk to an array with python?