从 C++ 仿真中保存和加载数据的有效方法
Posted
技术标签:
【中文标题】从 C++ 仿真中保存和加载数据的有效方法【英文标题】:Efficient ways to save and load data from C++ simulation 【发布时间】:2012-09-16 08:59:09 【问题描述】:我想知道哪些是保存和加载 C++ 数据的最佳方式。 我最感兴趣的是保存我在模拟中使用的类和矩阵(不是稀疏的)。 现在我只是将它们保存为 txt 文件,但是如果我将成员添加到类中,我必须修改加载数据的函数(它必须解析并检查 txt 文件中的值), 我认为不理想。
您一般会推荐什么? (附注:因为我想发布我的代码,我真的很想只使用标准 c++ 或可以重新分发的库)。
【问题讨论】:
看看Boost Serialization库。 那么你想要实现的是一些序列化机制,它可以让你添加新成员而不需要重写你的保存函数? 我主要是Matlab程序员,所以我通常使用内置的“保存”功能,不太在意细节。我也想在 C++ 中有一个通用的保存功能。我知道 matlab 使用 HDS 库,但我知道的不多。 不幸的是,现在您必须关心细节,因为它们很可能会影响您的整个设计。你能告诉我们更多(通过上面的编辑)你的模拟是否需要实时性能,中间保存,只有最终保存,不一定是世界上最快的,是否要保存 10 个对象,1000 个对象,1,000,000对象等? @JonathanSeng 对于最紧急的程序,我必须保存 3d 矩阵集(2-d 维度 + 时间)。大约它们的尺寸为 100x100x60。每个模拟运行 250 次(但我希望至少达到 1000 次)。当我在一夜之间运行它们时,写作速度并不重要。在稍后阶段,我加载每个模拟,评估每个模拟的某些指标并计算这些指标的某些统计数据。 【参考方案1】:在这种情况下,没有“最佳”。最适合您的方法在很大程度上取决于您的情况。但是,让我们举个例子,让您思考一下您的细节以及这个兔子洞可以有多深。
如果您绝对肯定必须毫无疑问地进行最快的保存(并且您愿意为此付出代价),您可以定义自己的内存管理,将所有对象放入一个常见类型的连续数组中(例如整数)。这使您可以非常快速地将该数组作为二进制数据写入磁盘。在有效地使用线程来加载每个核心/处理器以实时运行的模拟中,您可能需要它。
为什么是一个相当可怕的解决方案?因为它以“优化”的名义需要大量的工作并且冒着许多问题的风险。
-
它需要您构建自己的内存管理(运算符 new() 和运算符 delete()),这可能需要线程安全。
如果您尝试从该数组加载,则必须使用唯一的非修改构造函数放置新的所有对象,以确保正确设置所有虚拟指针。哦,你必须跟踪每个地址的类型到现在如何做到这一点。
为了与其他系统和二进制版本之间的可移植性,您需要使用实用程序将二进制格式转换为足以跨平台的通用格式(包括重新填充指向其他对象的指针)。
我已经做到了。这是非常不愉快的。我毫不怀疑它仍然存在问题,我在这里只列出了一些。但是,它非常、非常快,而且非常、非常、非常有问题。
您必须根据自己的需要进行设计。通常,第一个需求是“让它发挥作用”。不关心效率,只关心准确持续的事情,并且您在某个时候拥有已知和可访问的信息来执行此操作。此外,您应该封装保存和加载的过程。然后,如果需要“让它变得更好”,您应该能够更改那一点代码,其余的应该可以工作。您甚至可以根据用户需要选择保存格式,而不是您必须为所有用户假设的需要。
鉴于列出的所有假设、优点和缺点,您应该能够详细说明您对这个问题的特殊需求。
【讨论】:
【参考方案2】:鉴于性能不是您关心的问题——这是答案的关键部分——Boost 序列化库是一个很好的答案。
评论中的链接指向文档。阅读教程(这对于您最初想要的东西来说有点过分了,但非常值得)。
最后,由于您主要使用数组矩阵,因此请尝试封装保存和加载的整个过程,以便以后需要更改它,您正在编写一个新的实现并在现有的之间进行选择。我将 eddedmtime 用于 Boost 序列化的智能不会很好;但是,您可能会发现未来的需求会将您转移到其他或多个其他方面。
【讨论】:
【参考方案3】:C++ Middleware Writer 自动创建编组函数。当您将成员添加到类时,它会为您更新编组函数。
【讨论】:
以上是关于从 C++ 仿真中保存和加载数据的有效方法的主要内容,如果未能解决你的问题,请参考以下文章