存储大量仿真配置、运行值和最终结果的首选(或推荐)方法



我正在使用一些网络模拟器。在对它进行一些扩展之后,我需要进行许多不同的模拟和测试。我需要记录:

  • 仿真场景配置
  • 每个
  • 设备每个时间单位 t 的某些参数值(例如缓冲区大小、信号质量、位置)
  • 根据这些记录值计算的最终结果

在执行模拟后,需要第二个数据来执行一些可视化(简单的动画,显示一段时间内的一些统计数据)。

我正在使用Python和matplotlib等进行数据后处理和编写适当的应用程序(现在考虑pyQt或Django,但这不是问题的主题)。现在我想知道存储这些数据的最佳方法是什么?

我的第一个猜测是使用 XML 文件,但它可能会从 XML 语法中获得太多开销(我的意思是,文件可以增长到非常大的大小,尤其是对于数据类型的第二部分)。所以我尝试设计一个数据库...但在我看来,这也不是正确的方法......也许两者兼而有之?

我试图在谷歌上找到一些线索,但没有什么特别的。您是否曾经需要存储此类数据?你是怎么做到的?有没有"设计模式"?

单独的关注点:

除了考虑用于存储数据的技术(DBMS,CSV或科学数据的特定格式之一)之外,请注意,您需要管理三种非常不同类型的数据

    模拟
  • 场景配置:这些(通常)相当小,但它们需要易于编辑,易于重用,并且应该允许重现模拟运行。在这里,文本或代码文件似乎是一个不错的选择(这些也应该由版本控制)。

  • 原始模拟数据:如果您关心模拟性能,这是您应该非常小心的地方,因为如果实施不当,在运行期间写入 3 GB 的数据可能会花费大量时间。一种方法是为此目的使用现有文件格式(见下文),看看它们是否适合您。如果没有,您仍然可以使用 DBMS。此外,通常最好包含对生成数据的方案的说明(或至少是引用),因为这有助于管理结果。

  • 用于后处理的数据:如何存储这些数据主要取决于后处理工具。例如,如果可视化应用程序已有类结构,则可以定义一种文件格式,以便于读取所需数据。

寻找现有的解决方案:

您面临的问题(如何管理仿真数据?)是根本性的,并且有许多潜在的解决方案,每个解决方案都需要一定的权衡。当您从事网络模拟工作时,请查看社区中使用的其他工具提供的功能。可能是他们的开发人员遇到了您甚至还没有预料到的问题(关于可重现性等),并且已经找到了一个很好的解决方案。例如,您可以查看OMNeT++如何处理仿真输出:仿真配置在单独的文件中定义,结果写入vecsca文件(取决于其性质)。据我了解您对分层数据的问题,这也得到了支持(向量获得唯一的 ID 并与某些模型实体的属性相关联)。其他工具已经可以使用这些文件格式,例如将它们转换为其他格式,如CSV/MATLAB文件,因此您甚至可以考虑创建相同格式的文件(在此处记录)并使用现有工具/转换器进行后处理。

许多其他模拟工具将具有类似的功能,因此请查看最适合您的功能。

听起来你需要

为每个案例记录或多或少相同类型的信息,所以关系数据库听起来很合适——为什么你认为它"不是正确的方法"?

如果您的数据适合 CSV 文件的集合,那么您已经大部分时间都可以使用关系数据库了!只需存储在数据库表中,即可支持外键和查询。如果继续实现面向对象的解决方案,则可以从数据库中初始化对象。

如果你的数据结构是众所周知和稳定的,并且你需要一些SQL查询/计算功能,那么像SQLite这样的轻量级关系数据库可能是你要走的路(只要确保它可以处理你最终的3 + GB数据)。

否则 - 即每个模拟场景可能需要一个专用的数据结构来存储结果 - 并且您不需要任何SQL功能,那么最好使用更自由格式的解决方案(面向文档的数据库,OO数据库,文件系统+ csv,等等)。

请注意,在第二种情况下,您仍然可以使用 SQL 数据库,但您必须为每个结果集动态创建表,当然也必须动态创建相关的 SQL 查询。

最新更新