在c++中遍历大文件的好方法是什么?
What is a good way to traverse through a big file in c++
我有非常大的文件,其中包含数据包。文件本身就是一个非常大的字符串,包之间用字符串"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的代码(此代码假设包是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));
}
这通常是内存映射-io (MMIO)的一种情况。如果你只使用Windows,那么使用MapViewOfFile和该家族中的其他函数。对于跨平台使用,我推荐使用glib的文件映射函数。MMIO所做的是将文件的一部分(或整个文件)映射到进程的内存空间,这样您就可以通过一个简单的指针访问它。您可以任意决定映射文件的哪个部分和大小。
一种可能的策略是,在启动时,将文件的固定块映射到循环中的内存中(一块一块地),并在每个块中搜索第一个包标识符。这是相对较快的,并给出了第一组标记。在下次访问时,您可以使用这个初始集来查找文件的适当部分,映射它并仅扫描这部分。当然,您将存储出现的任何标记。
之后,当您滚动文件时,您只需映射页面(这次可以更小,这取决于您在某个时间点需要多少数据)并显示所需的数据。显然,包标记的地址可以同时用作内存映射的起始地址。
好的副作用是,它是完全无关大小的包,你可以映射任何大小的文件,甚至千兆字节大小的文件。通过在文件上使用小视图,应用程序的内存需求可以非常小。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 通过JNI传递数据数组的最快方法是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用不同的CRT将新的C++代码与旧的(二进制)组件隔离开来的最佳方法是什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 在C++中样板"冷/never_inline"错误处理技术的最佳方法是什么?
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 在C++中包含原型文件的正确方法是什么?
- 在 OpenCV C++ 中估计基本矩阵之前对相应点进行归一化的正确方法是什么?
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 在OSX上使用CMake将Adobe的XMP工具包构建为共享库的最简单方法是什么?
- 将一系列整数放入类的最佳方法是什么?
- 从长整整转换为uint64_t的推荐方法是什么?
- 将此布尔值传递给此函数的最有效方法是什么?
- 通过比较C++中的行在 txt 文件中搜索的最简单方法是什么?