场景:现设计一个文件格式如下:
文件头 + 采集数据块 + 事件描述块 + 用户备注描述块
其中文件头是固定长度的格式,采集数据块会根据采集的数据自动增长,事件描述块主要存储数据采集过程中发生的一些事件描述。也是自动增长的。用户备注主要用来存储数据采集或分析过程中不同用户的备注信息。也是自动增长的。
由于采集的数据周期长,数据量大。我使用分段映射来提高存取性能。采集数据的过程中,文件头(比如采集数据累计数等),采集数据块、事件描述块、用户备注块都要更新。所以我将文件头、采集数据块、事件描述块、备注块(起始地址192K)映射成四个部分。而且在数据采集的过程中,如果采集数据块,描述块映射空间不够用,还要重新映射下一段。
现在的问题是:
1.由于采集数据快,事件描述块,用户备注块都是不断增长的,如果采集数据块的数据超过64K了,重新映射下一个64K,不就将后面的事件描述块覆盖了吗?如何设计文件或者映射才能保证他们在一个文件中连续存储呢?
第一种方法:将第一个块的最后几个字节,保存为下一个块的起始地址,同时下一个块的开始几个字节保存上一个块的起始地址,这样就能首尾相呼应,你的问题迎刃而解(你可以将思路放开,只要能取到正确数据即可)
第二种方法:在存储数据的时候,进行数据判断,如果大于64KB你就将这些数据复制到一个临时的块中,然后将原来的数据删除,再开辟另一块地址将数据全部写进行,再清理掉临时块中数据(建议使用第一种方法,效率要高一些)
第一种方法我没太明白?初始如何映射文件头块,采集数据块,事件描述块,用户备注描述块呢?映射一般都要固定大小,那如果我将采集数据块映射64K大小,那如果采集数据块写满64K大小然后呢?
@Johnye: 第一种方法的内存块是不连续的,也就是说你知道第一个块的地址,但是第一个块填满后,第二个块的地址,是在第一个块的最后几个字节中,如果你要扫描的话,你就要取第一个块地址,然后取第二个块的地址,或者多个块的地址来进行扫描,当你把多个块的地址放到一起的时候,就是你数据的完整内存地址,然后你再去扫描,这种方法的中心思想就是数据结构中的链表结构。
@az235: 还有你这种“文件头 + 采集数据块 + 事件描述块 + 用户备注描述块”结构你就将他看作是一个二维表结构。
但是文件却是连续的啊?我想实现这样的数据文件:
| Header |
| Collect Raw Data1 |
| Collect Raw Data2 |
| Collect Raw Data3 |
| Collect Raw Data... |
| Event Data1 |
| Event Data2 |
| Event Data3 |
| Event Data.. |
| ................... |
有没有这方面的解决方案吗 ?
@Johnye: 已经实现的,目前没有