处理大型数据二进制文件
我正在处理包含原始数据的大型二进制文件(每个文件大约2 GB)。这些文件具有定义良好的结构,其中每个文件是events
的数组,每个事件是data banks
的数组。每个event
和data bank
都有一个结构(header
、data 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种类型的图表可以快速、实时地显示。放大时间间隔、动态选择信号类型等。
我希望您有一些想法。
相关文章