2013-05-06 87 views
0

我真的很大的文件,其中包含数据包。文件本身就是一个非常大的字符串,并且这些软件包与一个字符串“PACK1.0”分开。什么是遍历C++中的大文件的好方法

假设“XXX”是数据包看起来像这样:

PACK1.0XXXXXXXXXXXXXXXXXPACK1.0XXXXXXXXXXXXXXPACK1.0XXXXXXXXXX 

我创建一个哈希映射,其中包含包的地方开始的字节数,和。

例子:

PACKAGE NR | BYTE WHERE IT BEGINS IN THE STREAM 
0 | 0 
1 | 128 
2 | 256 
. | . 
. | . 

如果我想包号5340,我看在哪个字节包开始,去与stream.seekg(位置)字节的HashMap和分析数据包,在理论上。

我的最后一个问题是:我要出差槽采用了滑盖的文件,具有播放暂停&选项。我的想法是滑块具有min = 0和max = packagecount范围。

这是遍历文件的好方法吗?

这会导致什么问题?有什么更好的方法来做到这一点?

这是我的用于存储的散列映射代码(该代码假设一个包是128字节长):

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)); 
    } 
+2

考虑到包号是从零开始的连续整数,数组或向量听起来比散列映射更合适。 – 2013-05-06 20:01:53

+2

更不用说,如果你的软件包尺寸完全相同,并且提前知道尺寸,则不需要保留地图。您可以将包装大小乘以包装编号。 – OlivierD 2013-05-06 20:20:21

+0

实际上,大小可能会改变..我可以使用本地文件,但也可以通过TCP在网络上检索数据。 – Amazonasmann 2013-05-06 20:25:15

回答

0

这是usuually内存映射-10(MMIO)的情况。如果您只是Windows,请使用MapViewOfFile以及该系列中的其他功能。对于跨平台的使用,我建议glib的file map functions。 MMIO所做的是将文件的一部分(或整个文件)映射到进程的内存空间,以便通过简单的指针访问它。您可以任意确定文件的哪个部分以及它的大小。

为你的可能的策略可能是因为你,在启动时,该文件的一个固定块映射到内存在一个循环中,逐块),并搜索在每个块中的第一个包IDENTIFER。这相对较快,并为您提供第一组标记。在下次访问时,您可以使用此初始设置找到文件的正确部分,映射此文件并仅扫描此部分。当然,你会存储任何标记。

后来,当你通过你的文件,你刚才映射滚动页面(可能是较小的这段时间,这取决于你有多少数据需要在某一个时间点),并显示所需要的数据。显然,包标记的地址可以同时用作内存映射的起始地址。

尼斯的副作用是,它是完全不相干的包是什么尺寸,你可以映射任何大小的文件,甚至技嘉大小的文件。通过使用文件的小视图,应用程序的内存需求可以非常小。

相关问题