我有很大的文件,其中包含数据包。文件本身只是一个非常大的字符串,并且包中包含一个字符串“PACK1.0”。
假设“XXX”是数据,包看起来像这样:
PACK1.0XXXXXXXXXXXXXXXXXPACK1.0XXXXXXXXXXXXXXPACK1.0XXXXXXXXXX
我正在创建一个哈希映射,其中包含包的数量以及它开始的字节数。
示例:
PACKAGE NR | BYTE WHERE IT BEGINS IN THE STREAM
0 | 0
1 | 128
2 | 256
. | .
. | .
如果我想要软件包号5340,我会在hashmap中查看软件包开始的字节,转到带有stream.seekg(POSITION)的字节并在理论上解析软件包。
我的最后一个问题是:我想通过带滑块的文件,带有播放和暂停选项。我的想法是滑块有一个min = 0和max = packagecount范围。
这是遍历文件的好方法吗?
这会导致什么问题?有什么更好的方法呢?
这是我存储hashmap的代码(此代码假设包长度为128byte):
std::map<int, int> THEMAP;
thefile.seekg(0,std::ios::end);
dataLength=thefile.tellg();
thefile.seekg(0,std::ios::beg);
while(position<dataLength)
{
thefile.seekg(0,position);
position=position+128;
packagecount++;
THEMAP.insert(std::make_pair(packagecount,position));
}
答案 0 :(得分:0)
这通常是memory-mapped-io(MMIO)的一种情况。如果您只是Windows,请使用MapViewOfFile以及该系列中的其他功能。对于跨平台使用,我建议使用glib的file map functions。 MMIO所做的是将文件的一部分(或整个文件)映射到进程的内存空间,以便您可以通过简单的指针访问它。您可以任意确定文件的哪个部分及其大小。
您可能的策略是,在启动时,您可以逐个循环地将固定的文件块映射到内存中,并在每个块中搜索第一个包标识符。这相对较快,并为您提供第一组标记。在下次访问时,您可以使用此初始集来查找文件的正确部分,映射此内容并仅扫描此部分。当然,你会存储任何标记。
稍后,当您滚动浏览文件时,您只需映射页面(此时可以更小,具体取决于您在特定时间点需要多少数据)并显示所需数据。显然,包标记的地址可以同时用作内存映射的起始地址。
好的副作用是它与包的大小完全无关,你可以映射任何大小的文件,甚至是千兆字节大小的文件。通过在文件上使用小视图,应用程序的内存需求可能非常小。