我正在处理包含原始数据的大型二进制文件(每个大约 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 似乎更快;我将只提取我需要的任何数据,仅此而已,我不会“解压”整个二进制文件只是为了稍后提取我关心的数据。问题是我必须在每个函数中处理二进制文件结构;如果这种情况发生变化,那将是一个痛苦。我只会创建我将使用的数据的对象。
正如您从我的问题中看到的,我在处理大型结构和文件方面没有太多经验。我很感激任何建议。