处理大数据二进制文件

2024-05-20

我正在处理包含原始数据的大型二进制文件(每个大约 2 GB)。这些文件具有明确定义的结构,其中每个文件都是一个数组events,每个事件都是一个数组data banks. Each event and data bank有一个结构(header, data type, etc.).

从这些文件中,我所要做的就是提取我可能需要的任何数据,然后我只需分析和使用这些数据即可。我可能不需要所有数据,有时我只是提取XType数据,其他而已YType, etc.

我不想搬起石头砸自己的脚,所以我请求有关如何处理此问题的指导/最佳实践。我能想到两种可能性:

Option 1

  • 定义一个DataBank类,这将包含实际数据(std::vector<T>)以及它具有的任何结构。
  • 定义一个Event类,这有一个std::vector<DataBank>加上任何结构。
  • 定义一个MyFile类,这是一个std::vector<Event>加上任何结构。

的构造函数MyFile将需要一个std:string(文件名),并将完成将二进制文件读入上面的类的所有繁重工作。

然后,我从二进制文件中需要的任何东西都只是MyFile班级;我可以循环通过Events,我可以循环遍历DataBanks,我需要的一切都已经在这个“解压”的对象中了。

这里的工作流程如下:

int main() {
    MyFile data_file("data.bin");
    std::vector<XData> my_data = data_file.getXData();
    \\Play with my_data, and never again use the data_file object
    \\...
    return 0;
}

Option 2

  • 编写函数std::string作为参数,并从文件中提取我需要的任何内容,例如std::vector<XData> getXData(std::string), int getNumEvents(std::string), etc.

这里的工作流程如下:

int main() {
    std::vector<XData> my_data = getXData("data.bin");
    \\Play with my_data, and I didn't create a massive object
    \\...
    return 0;
}

我看到的优点和缺点

选项 1 似乎是一个更干净的选项,我只会“解压”一次二进制文件MyFile构造函数。但我将创建一个巨大的对象,其中包含 2 GB 文件中的所有数据,但我永远不会使用它。如果我需要分析 20 个文件(每个文件 2 GB),我需要 40 GB 的内存吗?我不明白这些是如何处理的,这会影响性能吗?

选项 2 似乎更快;我将只提取我需要的任何数据,仅此而已,我不会“解压”整个二进制文件只是为了稍后提取我关心的数据。问题是我必须在每个函数中处理二进制文件结构;如果这种情况发生变化,那将是一个痛苦。我只会创建我将使用的数据的对象。

正如您从我的问题中看到的,我在处理大型结构和文件方面没有太多经验。我很感激任何建议。


不知道下面的场景是否符合你的情况。

我有一个处理汽车领域硬件信号记录的巨大日志文件的案例。有时会定期出现门锁、收音机打开、温度等数千种信号。操作员选择一些信号类型,然后分析信号值的图表。

此场景基于随时间增长的巨大日志文件。

我所做的是以优化的二进制格式为每种信号类型创建自己的日志文件提取(将加载固定大小的 byte[] 数组)。

这意味着仅包含 10 种类型的图表就可以快速、实时地显示。放大时间间隔、动态选择信号类型等。

我希望你有一些想法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

处理大数据二进制文件 的相关文章