我在非常大的文件中有顺序(打包的c-struct)格式的timeseries数据.每个 struct 都按一定顺序包含K个不同类型的字段.文件本质上是这些 struct 的数组(按行).我希望能够mmap文件并将每个字段映射到一个numpy数组(或另一种形式),在这个数组中,数组可以识别出数据帧中别名为列的跨距( struct 的大小).
示例 struct 可能是:
struct {
int32_t a;
double b;
int16_t c;
}
可以使用python生成这样的记录文件,如下所示:
from struct import pack, unpack
db = open("binarydb", "wb")
for i in range(1,1000):
packed = pack('<idh', i, i*3.14, i*2)
db.write(packed)
db.close()
然后,问题是如何将这样的文件作为数据帧有效地查看.如果我们假设文件的长度为数亿行,则需要使用mem映射解决方案.
使用memmap,如何将numpy数组(或替代数组 struct )映射到列a的整数序列.在我看来,这需要能够指示int32系列"a"的跨距(14字节)和偏移量(在本例中为0),float64系列"b"的偏移量为4,int16系列"c"的偏移量为12.
我已经看到,如果一个mmap'ed文件包含一个数据类型,那么可以很容易地针对该文件创建一个numpyarray.是否有方法通过指示类型、偏移和跨距来 pull 此文件中的不同系列?使用这种方法,可以将mmapped列呈现给pandas或其他数据帧实现.
更好的是,是否有一种简单的方法可以将自定义mem映射格式集成到Dask中,从而在文件中获得延迟分页的好处?