什么是遍历C++中的大文件的好方法
我真的很大的文件,其中包含数据包。文件本身就是一个非常大的字符串,并且这些软件包与一个字符串“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));
}
这是usuually内存映射-10(MMIO)的情况。如果您只是Windows,请使用MapViewOfFile以及该系列中的其他功能。对于跨平台的使用,我建议glib的file map functions。 MMIO所做的是将文件的一部分(或整个文件)映射到进程的内存空间,以便通过简单的指针访问它。您可以任意确定文件的哪个部分以及它的大小。
为你的可能的策略可能是因为你,在启动时,该文件的一个固定块映射到内存在一个循环中,逐块),并搜索在每个块中的第一个包IDENTIFER。这相对较快,并为您提供第一组标记。在下次访问时,您可以使用此初始设置找到文件的正确部分,映射此文件并仅扫描此部分。当然,你会存储任何标记。
后来,当你通过你的文件,你刚才映射滚动页面(可能是较小的这段时间,这取决于你有多少数据需要在某一个时间点),并显示所需要的数据。显然,包标记的地址可以同时用作内存映射的起始地址。
尼斯的副作用是,它是完全不相干的包是什么尺寸,你可以映射任何大小的文件,甚至技嘉大小的文件。通过使用文件的小视图,应用程序的内存需求可以非常小。
考虑到包号是从零开始的连续整数,数组或向量听起来比散列映射更合适。 – 2013-05-06 20:01:53
更不用说,如果你的软件包尺寸完全相同,并且提前知道尺寸,则不需要保留地图。您可以将包装大小乘以包装编号。 – OlivierD 2013-05-06 20:20:21
实际上,大小可能会改变..我可以使用本地文件,但也可以通过TCP在网络上检索数据。 – Amazonasmann 2013-05-06 20:25:15