Modelica大文件读取优化咨询:Dymola海量参数高效读取方法
Dymola读取大体积数据文件的优化方法
针对你读几万行以上大文件的需求,给你几个比硬编码行列数更高效的读取方案:
1. 让Dymola自动识别行列数
对于.mat文件,不用手动指定nrow和ncol,直接调用Streams.readRealMatrix时只传文件名和矩阵名就行,Dymola会自动解析文件里的矩阵实际尺寸,既省得你数行列,还能避免硬编码行数导致的错误:
data := Streams.readRealMatrix("C:/Users/Raoul/Desktop/SIM/data/f16.mat", matrixName = "data");
这种方式尤其适合后续文件可能更新行数的场景,不用每次改代码里的行数参数。
2. 超大规模文件用分块读取
如果文件行数几十万甚至上百万,一次性加载占内存太多,就分批读,每次处理一小段:
parameter Integer chunk_size = 10000; // 每次读1万行 Integer total_rows = Streams.countLines("C:/Users/Raoul/Desktop/SIM/data/f16.csv") - 1; // 减1是跳过表头(csv文件有表头的话) for i in 1:ceil(total_rows/chunk_size) loop Integer start_row = (i-1)*chunk_size + 1; Integer end_row = min(i*chunk_size, total_rows); Real[:,:] chunk = Streams.readRealMatrix("C:/Users/Raoul/Desktop/SIM/data/f16.csv", nrow=end_row-start_row+1, ncol=data_cols, skipLines=start_row-1); // 这里写处理当前块的逻辑,比如存到数组里或者直接做计算 end for;
注意:分块读取更适合.csv这类文本文件,.mat是二进制格式,一次性读效率本来就高,除非内存实在不够才用分块,或者提前用MATLAB把大.mat拆成小文件。
3. 不同格式文件用专用函数
- Excel文件(.xlsx):别用通用读取方法,直接用
Modelica.Utilities.Files.loadXLSX,专门针对Excel优化,还能指定工作表和数据范围,不用解析那些没用的格式信息:data := Modelica.Utilities.Files.loadXLSX("C:/Users/Raoul/Desktop/SIM/data/f16.xlsx", sheet="Sheet1", range="A1:D" + String(total_rows)); - .mat文件:确保是MATLAB v5及以上的二进制格式,别存成ASCII文本格式,Dymola读二进制
.mat的速度和内存占用都比文本格式好太多。
4. 把数据预加载成参数
如果数据文件是固定不变的,直接把数据定义成parameter类型,Dymola会在编译阶段就把数据读进内存,仿真的时候直接用,不用每次仿真都读一遍文件:
parameter Real[:,:] data = Streams.readRealMatrix("C:/Users/Raoul/Desktop/SIM/data/f16.mat", matrixName = "data");
额外提醒
- 别在仿真循环里反复调用文件读取函数,会把仿真速度拖慢一大截;
- 优先用二进制格式(.mat),比csv、xlsx这类文本/表格格式读取快得多,还省内存;
- 数据如果有冗余或者不需要的内容,先在Python、MATLAB里清洗好再导入Dymola,减少不必要的计算量。
内容的提问来源于stack exchange,提问作者Raoulll
相关产品推荐
相关产品推荐

