首页 新闻 会员 周边

复杂数据文件的内存映射问题.文件中多个部分都不是固定大小,而是自动增长的.

0
悬赏园豆:100 [待解决问题]

场景:现设计一个文件格式如下:
       文件头 + 采集数据块 + 事件描述块 + 用户备注描述块
      其中文件头是固定长度的格式,采集数据块会根据采集的数据自动增长,事件描述块主要存储数据采集过程中发生的一些事件描述。也是自动增长的。用户备注主要用来存储数据采集或分析过程中不同用户的备注信息。也是自动增长的。
      由于采集的数据周期长,数据量大。我使用分段映射来提高存取性能。采集数据的过程中,文件头(比如采集数据累计数等),采集数据块、事件描述块、用户备注块都要更新。所以我将文件头、采集数据块、事件描述块、备注块(起始地址192K)映射成四个部分。而且在数据采集的过程中,如果采集数据块,描述块映射空间不够用,还要重新映射下一段。

现在的问题是:
       1.由于采集数据快,事件描述块,用户备注块都是不断增长的,如果采集数据块的数据超过64K了,重新映射下一个64K,不就将后面的事件描述块覆盖了吗?如何设计文件或者映射才能保证他们在一个文件中连续存储呢?

Johnye的主页 Johnye | 初学一级 | 园豆:87
提问于:2012-05-01 20:42
< >
分享
所有回答(1)
0

第一种方法:将第一个块的最后几个字节,保存为下一个块的起始地址,同时下一个块的开始几个字节保存上一个块的起始地址,这样就能首尾相呼应,你的问题迎刃而解(你可以将思路放开,只要能取到正确数据即可)

 

第二种方法:在存储数据的时候,进行数据判断,如果大于64KB你就将这些数据复制到一个临时的块中,然后将原来的数据删除,再开辟另一块地址将数据全部写进行,再清理掉临时块中数据(建议使用第一种方法,效率要高一些)

az235 | 园豆:8483 (大侠五级) | 2012-05-01 21:48

第一种方法我没太明白?初始如何映射文件头块,采集数据块,事件描述块,用户备注描述块呢?映射一般都要固定大小,那如果我将采集数据块映射64K大小,那如果采集数据块写满64K大小然后呢?

支持(0) 反对(0) Johnye | 园豆:87 (初学一级) | 2012-05-01 22:07

@Johnye: 第一种方法的内存块是不连续的,也就是说你知道第一个块的地址,但是第一个块填满后,第二个块的地址,是在第一个块的最后几个字节中,如果你要扫描的话,你就要取第一个块地址,然后取第二个块的地址,或者多个块的地址来进行扫描,当你把多个块的地址放到一起的时候,就是你数据的完整内存地址,然后你再去扫描,这种方法的中心思想就是数据结构中的链表结构。

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-05-01 22:17

@az235: 还有你这种“文件头 + 采集数据块 + 事件描述块 + 用户备注描述块”结构你就将他看作是一个二维表结构。

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-05-01 22:19

但是文件却是连续的啊?我想实现这样的数据文件:

            | Header                   |

            | Collect Raw Data1   |

            | Collect Raw Data2   |

            | Collect Raw Data3   |

            | Collect Raw Data...  |

            | Event   Data1          |

            | Event   Data2          |

            | Event   Data3          |

            | Event   Data..          |

            | ...................          |

支持(0) 反对(0) Johnye | 园豆:87 (初学一级) | 2012-05-02 12:08

有没有这方面的解决方案吗 ?

支持(0) 反对(0) Johnye | 园豆:87 (初学一级) | 2012-05-14 10:57

@Johnye: 已经实现的,目前没有

支持(0) 反对(0) az235 | 园豆:8483 (大侠五级) | 2012-05-14 11:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册