读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
What is the best way to read large file (>2GB) (Text file contains ethernet data) and access the data randomly by different parameters?
我有一个文本文件,如下所示:
0.001 ETH Rx 1 1 0 B45678810000000000000000AF0000 555
0.002 ETH Rx 1 1 0 B45678810000000000000000AF 23
0.003 ETH Rx 1 1 0 B45678810000000000000000AF156500
0.004 ETH Rx 1 1 0 B45678810000000000000000AF00000000635254
我需要一种方法来读取此文件并形成结构并将其发送到客户端应用程序。
目前,我可以在 Boost 的循环队列的帮助下做到这一点。
这里需要在不同的时间访问不同的数据。
例如:如果我想在当前为100秒时以0.03 秒的速度访问数据,我如何以最佳方式执行此操作,而不是让文件指针跟踪,或将整个文件保存到导致性能瓶颈的内存中?(考虑到我有一个大小为 2 GB的文件,其中包含上述类型的数据(
通常,处理大文件的最佳实践取决于平台架构(x86/x64(和操作系统(Windows/Linux等(。
既然你提到了提升,你有没有考虑过使用升压内存映射文件? 升压内存映射文件
这一切都取决于
- A. 数据访问的频率
-
B. 数据访问的模式
-
拆分文件如果您需要偶尔访问数据,那么这个 2GB 日志 设计很好,如果没有,可以调整记录器以生成日志 周期间隔/后期逻辑可以将 2GB 文件拆分为所需的方式 较小的文件。以便获取范围日志文件,然后读取 日志数据,然后整理出所需的行更容易,因为文件 读取字节将在此处减少。
缓存 对于非常频繁的数据访问,为了更快的响应,维护缓存是一个很好的解决方案,正如您所说,它有自己的瓶颈。缓存内存选择的大小和模式完全取决于 b. 数据访问的模式是什么。缓存大小越大,响应速度越慢,应该是最佳的。
数据库如果搜索模式是无序的/动态增长的,那么数据库将起作用。同样,在这里它不会像小缓存那样提供更快的响应。
将数据库与完美的表组织相结合,以支持查询类型+较小的缓存层将提供最佳结果。
-
这是我找到的解决方案:
- 使用循环缓冲区(Boost 无锁缓冲区(解析文件并保存行的结构化格式
- 使用的单独线程:
- 一个将连续解析文件并推送到锁定空闲队列
- 一个人将连续地从缓冲区读取,处理行,形成一个结构并推送到另一个队列
- 每当用户需要随机数据时,根据时间,我会将文件指针移动到特定行并仅读取特定行。
- 两个线程都有互斥等待机制,一旦达到预定义的缓冲区限制,就会停止解析
- 用户将随时获取数据,无需存储完整的文件内容。读取帧时,我将从队列中删除帧。所以文件大小无关紧要。填充缓冲区的并行线程允许每次都不花时间读取文件。
- 如果我想移动到其他行,请移动文件指针,擦除现有数据,再次启动线程。
注意:现在唯一的问题是将文件指针移动到特定行。 我需要逐行解析,直到到达重点。
如果存在将文件指针移动到所需行的任何解决方案,那将很有帮助。可以使用二叉搜索或任何有效的搜索算法,并会得到我想要的。
如果有人为上述新问题提供解决方案,我将不胜感激!
- 可变参数模板与使用元组在参数中添加不同的数据对
- 带参数的数据结构的全局声明
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 如果参数与数据成员的参数同名,该怎么办?
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 自动模板参数、数据成员和恒常性
- 如何使用宏根据参数定义不同的数据类型?
- 参数数据类型未知的可变参数函数
- 将私有数据成员作为默认参数传递给该类的公共方法时出错
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 具有重载方法的可变参数数据结构
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- 模板 使用数据数组调用函数时扩展参数包
- 二进制数据作为命令行参数
- 使用 std::function 作为具有任意数量参数的数据成员
- pybind11:如何包装以 std::vector<double> 为参数以避免数据复制的 C++ 函数
- 类数据成员指针的非类型模板参数包无法使用 gcc 编译
- 我可以通过命令行参数传递给C++程序多少数据?
- 为什么指定数据类型而不是构造功能参数?C
- OpenGL glBufferData -> 为什么 &vertices[0] 而不是 &vertices 作为数据参数?