打开大结果垫文件引发缓冲区对于请求的数组来说太小

Opening big result mat-File raises buffer is too small for requested array

我已经成功完成了为期一周的 Dymola 模拟,却发现自己无法使用 DyMat 加载结果 mat 文件。

每次我尝试使用 Python 和 DyMat (https://www.j-raedler.de/projects/dymat/) 打开它时,我都会收到错误消息:

buffer is too small for requested array

问题似乎来自巨大的模型大小和数据记录。如果我只模拟 mat-File 打开时间的 1/3 就好了。

有人知道如何解决这个问题吗?

我在将 MAT 格式的大型 Dymola 仿真结果读取到 Python 时也遇到过类似的问题(尽管我使用的是 modelicares 而不是 DyMat,请参阅 http://kdavies4.github.io/ModelicaRes/ )。对我来说,问题似乎出现在具有多个时间步长的结果中,即使写入文件的变量很少。

目前有效的一种解决方法是:即使无法在 Python 中加载大型 MAT 文件,我也可以将结果文件加载回 Dymola 并从那里导出结果作为 SDF 或 CSV。缺点当然是生成的 SDF 或 CSV 文件甚至比原始 MAT 文件更大,这涉及另一个手动步骤,但从那里,我总是能够将 SDF 或 CSV 数据加载到 Python,例如使用 sdf Python 包。如果这种情况发生得更频繁,也可能会编写一个 MOS 脚本来自动执行将 MAT 文件加载到 Dymola 并将其导出为 SDF 或 CSV 的过程。

此解决方案并不理想,但作为解决方法可能会有帮助。如果有更好的解决方案,我也很乐意听到它们。

我通过使用 protected 关键字声明不需要的所有参数和变量,轻松解决了这个问题。

例如:

protected // I dont need the parameters below here
    parameter SI.Pressure p_nom = 10e5;
    parameter SI.Density rho_w = 1000;

public // Parameters below are visible in the simulation result
   SI.Pressure p;
   Real t;     

protected // Another Private block removing v from the simulation result
   SI.Velocity v;

您可以通过在 Dymola 的模拟设置中选中它来使受保护的变量再次可见。

此外,请确保您没有激活“在事件中存储变量”并且没有足够长的间隔长度。如果您只需要存储几个参数,最好使用此处描述的另一个过程:Selection of variables to be saved in the result file

使用 protected 和 public 将模拟文件大小从 9 GB 减少到 1 GB 以下解决了我的问题。

对于大多数人来说,这可能是一个显而易见的答案,但我只是不认为它会解决问题。

为了减少结果文件的大小,Dymola 还支持一种称为“变量选择”的东西,它可以让您更精细地控制存储的变量(除了状态之外)以及它们应该如何分组。请参阅 Dymola 手册。