处理大型数据二进制文件

我正在处理包含原始数据的大型二进制文件(每个文件大约2 GB)。这些文件具有定义良好的结构,其中每个文件是events的数组,每个事件是data banks的数组。每个eventdata bank都有一个结构(headerdata type等)。

从这些文件中,我所要做的就是提取我可能需要的任何数据,然后我只需分析和处理这些数据。我可能不需要所有数据,有时我只提取XType数据,其他只需要YType,等等。

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

选项1

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

MyFile的构造函数将接受std:string(文件名),并将执行将二进制文件读入上述类的所有繁重任务。

然后,我从二进制文件中需要的任何东西都将只是MyFile类的一个方法;我可以遍历Events,我可以遍历DataBanks,我所需要的一切都已经在这个";unpack";对象中了。

此处的工作流程如下:

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;
}

选项2

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

此处的工作流程如下:

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的RAM?我不明白这些是如何处理的,这会影响性能吗?

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

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


解决方案

我不知道以下方案是否与您的方案匹配。

我在汽车领域有过一个处理硬件信号日志的巨大日志文件的案例。门上锁、无线电开着、温度等信号有时会定期出现。操作员选择一些信号类型,然后分析信号值的图表。

此方案基于随时间推移不断增长的巨大日志文件。

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

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

我希望您有一些想法。

相关文章