7

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

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

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

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

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

我试图在谷歌中找到一些线索,但没有发现什么特别之处。您是否曾经需要存储此类数据?你是怎么做到的?是否有任何“设计模式”?

4

3 回答 3

5

单独的关注点:

除了思考用于存储数据的技术(DBMS、CSV,或者可能是科学数据的特定格式之一)之外,请注意您需要管理三种截然不同的数据

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

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

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

寻找现有的解决方案:

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

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

于 2012-06-30T07:55:55.130 回答
1

听起来您需要为每种情况记录或多或少相同类型的信息,所以关系数据库听起来很合适——为什么您认为它“不是正确的方法”?

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

于 2012-06-28T11:57:44.060 回答
1

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

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

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

于 2012-06-28T12:15:55.427 回答