读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?

What is the best way to read large file (>2GB) (Text file contains ethernet data) and access the data randomly by different parameters?

本文关键字:数据 参数 随机 访问 是什么 方法 最佳 2GB gt 文本 读取      更新时间:2023-10-16

我有一个文本文件,如下所示:

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. 数据访问的模式

    1. 拆分文件如果您需要偶尔访问数据,那么这个 2GB 日志 设计很好,如果没有,可以调整记录器以生成日志 周期间隔/后期逻辑可以将 2GB 文件拆分为所需的方式 较小的文件。以便获取范围日志文件,然后读取 日志数据,然后整理出所需的行更容易,因为文件 读取字节将在此处减少。

    2. 缓存
    3. 对于非常频繁的数据访问,为了更快的响应,维护缓存是一个很好的解决方案,正如您所说,它有自己的瓶颈。缓存内存选择的大小和模式完全取决于 b. 数据访问的模式是什么。缓存大小越大,响应速度越慢,应该是最佳的。

    4. 数据库
    5. 如果搜索模式是无序的/动态增长的,那么数据库将起作用。同样,在这里它不会像小缓存那样提供更快的响应。

    6. 数据库与完美的表组织相结合,以支持查询类型+较小的缓存层将提供最佳结果。

这是我找到的解决方案:

  1. 使用循环缓冲区(Boost 无锁缓冲区(解析文件并保存行的结构化格式
  2. 使用的单独线程:
    • 一个将连续解析文件并推送到锁定空闲队列
    • 一个人将连续地从缓冲区读取,处理行,形成一个结构并推送到另一个队列
    • 每当用户需要随机数据时,根据时间,我会将文件指针移动到特定行并仅读取特定行。
  3. 两个线程都有互斥等待机制,一旦达到预定义的缓冲区限制,就会停止解析
  4. 用户将随时获取数据,无需存储完整的文件内容。读取帧时,我将从队列中删除帧。所以文件大小无关紧要。填充缓冲区的并行线程允许每次都不花时间读取文件。
  5. 如果我想移动到其他行,请移动文件指针,擦除现有数据,再次启动线程。

注意:现在唯一的问题是将文件指针移动到特定行。 我需要逐行解析,直到到达重点。

如果存在将文件指针移动到所需行的任何解决方案,那将很有帮助。可以使用二叉搜索或任何有效的搜索算法,并会得到我想要的。

如果有人为上述新问题提供解决方案,我将不胜感激!