科学应用程序输入文件格式的建议

计算科学 数据管理
2021-12-24 23:30:33

假设一个程序是用 C、C++、Fortran 或 python 编写的,鉴于用户可能相对多样化,即​​不熟悉源代码,您认为输入文件的最佳格式是什么?我目前的兴趣是热力学属性工具,但讨论可能更笼统。以下是我认为的主要选项:

  • 哑 ASCII 文件

    VARIABLE_NAME
    300
    OTHER_VARIABLE
    101325
    STRING_ARRAY
    N2 O2
    
  • 更多涉及的 ASCII 文件:例如,一些自定义分隔符可以更好地处理数组输入。本质上,您正在尝试对您的数据保持智能,并拥有一个比哑 ASCII 更灵活的自定义解析器

  • JSON

  • xml

你还有什么推荐的吗?很多工具选择路线#2,但我真的不喜欢它,你经常会得到奇怪的非标准语法,这比帮助更令人困惑。

4个回答

我可能会争辩说,XML 的主要优点是可以轻松编写解析器,而不是轻松编写实际的 XML 文档。在我看来,JSON 似乎是一个更好的选择。两者都具有在某种程度上成为标准的优势,这意味着人们不必学习您选择的程序采用的任何晦涩难懂的语法。

您提到了 Python,我认为一个简单的 Python 文件将比具有自定义语法的文本文件更容易访问,甚至更多。无论如何,人们都需要学习一种新的语法,这不太可能比“入门级”python 简单。

以我的经验,输入文件通常最终会带有某种宏功能,这会意外地变成图灵完备的。在这种情况下,最好有一种“适当的”语言,包括所有这些。

以在 FLUKA 或 Geant4 等 Monte Carlo 粒子输运代码中定义几何的问题为例。虽然许多此类代码使用自定义语法(您的案例 2),但完整的脚本语言允许您使用循环和条件,允许您在很短的时间内定义几何。

Python 的其他替代品是 Lua,它在游戏行业中被大量使用,Julia 甚至是 Javascript(它对数字的处理能力低于标准)。

我不同意这个问题的“尽可能简单”的答案。

选项 1 和 2 将您锁定在您以后很难改变的事情上。例如,您会发现,如果您的参数数量增加,您会希望将它们放入部分和小部分中,因为这样更易于组织。但是您的语法不允许这样做。这就是为什么 Microsoft Windows 配置文件有这些奇怪的[section]标记的原因——但它们既不能真正帮助澄清部分(因为没有“结束部分”标记),也不允许嵌套。换句话说,Windows 配置文件是一个很好的例子,“好吧,该死,应该提前考虑一下”(当然,这是具有许多 Microsoft 功能的运行主题。)

所以,不要这样做,你会后悔走这条路,并不断发明奇怪的解决方法来做你希望事先考虑过的事情。

另一方面,如果您让机器编写文件,则选项 4 非常好,但如果是人类正在编写,则不是。人们曾尝试编写科学软件,其中输入文件是手动创建并具有 XML 格式的——我曾是这样做的组织的董事会成员,这完全是一场灾难,因为人们反抗:XML 根本不可读也不可写给人类。

这只剩下选项 3。无论您选择 JSON 还是选择更容易但具有相同表现力的东西都没有那么重要。但它应该是人类可读、人类可写的,并且具有某种语法。输入文件想说什么也应该是不言自明的,这对于您的选项 1 和 4 都不是正确的。最后,在您的代码中实现它应该相对简单,这需要一些已经存在的东西解析器。

不要忽略专为科学数据集设计的HDF5 ,它绑定了您提到的所有语言,除此之外。它被广泛使用,并且有一些工具可以在没有编程的情况下浏览内部文件。如果您愿意(尽管我不知道您为什么会这样做),您甚至可以将 HDF5 文件转储为 XML。

它的主要目的可能是用于大型数据集,但它也可以处理非常小的数据集。实际上,您应该考虑它的一个原因正是因为您可以将参数和作业设置的其他位存储在与输入和输出数据集相同的文件中。

这个答案就像 LKlevin 的,但是太长了,不能作为评论添加。

如果输入文件不允许完全通用(图灵完成?)指令是可以的,那么我会使用 json.

如果您想允许用户在由您的软件严格控制的设置中指定图灵完整指令,那么我会使用 lua。

如果你想让用户在他们的输入文件中做任何事情(从互联网下载东西、读取文件、破解执行沙箱、破解主机),那么让他们使用 python。