读取大文件(> 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 的循环队列来完成此操作。
这里的需求是在不同的时间访问不同的数据。
Ex:如果我想在 0.03sec 访问数据,而我目前处于 100sec,我该如何在最好的方法而不是跟踪文件指针,或者将整个文件保存到导致性能瓶颈的内存中? (考虑到我有一个大小为 2 GB 的文件,其中包含上述类型的数据)
通常,处理大文件的最佳做法取决于平台架构 (x86/x64) 和 OS(Windows/Linux 等)
既然提到了boost,有没有考虑过使用boost内存映射文件?
Boost Memory Mapped File
全靠
- 一个。数据访问的频率
b.数据访问是什么模式
正在拆分文件
如果您需要偶尔访问数据,那么这个 2GB 日志
设计很好,如果不是,可以调整记录器以生成日志
periodic interval/后者逻辑可以将 2GB 文件拆分为所需的格式
较小的文件。这样就可以获取范围日志文件然后读取
日志数据,然后整理出所需的行更容易,因为文件
这里会减少读字节数。
缓存
对于非常频繁的数据访问,为了更快的响应,维护缓存是一个不错的解决方案,正如您所说,它也有其自身的瓶颈。缓存内存选择的大小和模式完全取决于b。数据访问的模式是什么。另外缓存越大响应越慢,应该是最优的。
数据库
如果搜索模式是 un-ordered/dynamically 随着使用而增长,那么数据库将起作用。同样在这里它不会像小缓存那样提供更快的响应。
具有完美table组织以支持查询类型的数据库+较小的缓存层将提供最佳结果。
这是我找到的解决方案:
- 使用循环缓冲区(Boost lock free Buffers)来解析文件和保存行的结构化格式
- 使用独立线程:
- 一个会不断的解析文件并推送到lock free queue
- 一个会不断的从buffer中读取,处理line,形成一个结构然后push到另一个queue
- 每当用户需要随机数据时,根据时间,我会将文件指针移动到特定行并只读取特定行。
- 两个线程都有互斥等待机制,一旦达到预定义的缓冲区限制就停止解析
- 用户随时获取数据,无需存储完整的文件内容。当帧被读取时,我将从队列中删除帧。所以文件大小并不重要。填充缓冲区的并行线程可以避免每次都花时间读取文件。
- 如果我想移动到其他行,移动文件指针,擦除现有数据,重新启动线程。
注:
现在唯一的问题是将文件指针移动到特定行。
我需要逐行解析直到我到达那个点。
如果存在任何将文件指针移动到所需行的解决方案,那将很有帮助。可以使用二进制搜索或任何有效的搜索算法,并将得到我想要的。
如果有人为上述新问题提供解决方案,我将不胜感激!
我有一个如下所示的文本文件:
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 的循环队列来完成此操作。
这里的需求是在不同的时间访问不同的数据。
Ex:如果我想在 0.03sec 访问数据,而我目前处于 100sec,我该如何在最好的方法而不是跟踪文件指针,或者将整个文件保存到导致性能瓶颈的内存中? (考虑到我有一个大小为 2 GB 的文件,其中包含上述类型的数据)
通常,处理大文件的最佳做法取决于平台架构 (x86/x64) 和 OS(Windows/Linux 等)
既然提到了boost,有没有考虑过使用boost内存映射文件? Boost Memory Mapped File
全靠
- 一个。数据访问的频率
b.数据访问是什么模式
正在拆分文件 如果您需要偶尔访问数据,那么这个 2GB 日志 设计很好,如果不是,可以调整记录器以生成日志 periodic interval/后者逻辑可以将 2GB 文件拆分为所需的格式 较小的文件。这样就可以获取范围日志文件然后读取 日志数据,然后整理出所需的行更容易,因为文件 这里会减少读字节数。
缓存 对于非常频繁的数据访问,为了更快的响应,维护缓存是一个不错的解决方案,正如您所说,它也有其自身的瓶颈。缓存内存选择的大小和模式完全取决于b。数据访问的模式是什么。另外缓存越大响应越慢,应该是最优的。
数据库 如果搜索模式是 un-ordered/dynamically 随着使用而增长,那么数据库将起作用。同样在这里它不会像小缓存那样提供更快的响应。
具有完美table组织以支持查询类型的数据库+较小的缓存层将提供最佳结果。
这是我找到的解决方案:
- 使用循环缓冲区(Boost lock free Buffers)来解析文件和保存行的结构化格式
- 使用独立线程:
- 一个会不断的解析文件并推送到lock free queue
- 一个会不断的从buffer中读取,处理line,形成一个结构然后push到另一个queue
- 每当用户需要随机数据时,根据时间,我会将文件指针移动到特定行并只读取特定行。
- 两个线程都有互斥等待机制,一旦达到预定义的缓冲区限制就停止解析
- 用户随时获取数据,无需存储完整的文件内容。当帧被读取时,我将从队列中删除帧。所以文件大小并不重要。填充缓冲区的并行线程可以避免每次都花时间读取文件。
- 如果我想移动到其他行,移动文件指针,擦除现有数据,重新启动线程。
注: 现在唯一的问题是将文件指针移动到特定行。 我需要逐行解析直到我到达那个点。
如果存在任何将文件指针移动到所需行的解决方案,那将很有帮助。可以使用二进制搜索或任何有效的搜索算法,并将得到我想要的。
如果有人为上述新问题提供解决方案,我将不胜感激!