Save data during matlab loop
조회 수: 19 (최근 30일)
이전 댓글 표시
Hello community!
Time for another question :)
My current project is a simulation run by matlab. So mainly it is a call of a "SimulateStep" function in which a lot of different things happen.
One of the things is the call of a huge mex function which gives me some internal data. So, during each call I have a relativly big struct that has a lot of data in it.
And my question is now: What is the most efficient way to save this data during each step and save it with the propriate time? Also, it should be easy to access and read it afterwards.
My current attemp is looking like that:
function saveData(this, time)
% input data
namelist = fieldnames(this.structToSave);
for it = 1: length(namelist)
name = char(namelist(it));
if ~isfield(this.timeSeries, name)
this.timeSeries.(name) = timeseries;
end
this.timeSeries.(name) = addsample(this.timeSeries.(name), 'Data', this.structToSave.(name), 'Time', time);
end
end
It works pretty good. At the end of the simulation I save the "timeSeries" struct to a workspace variable and that's it.
But this attemp is way to slow. If I have a list of ~30-40 signals to save you can heavily feel the simulation getting slower.
Does someone has any better alternative to that? Or is it only my programing that sucks here? ;)
Thanks a lot!
댓글 수: 2
채택된 답변
Walter Roberson
2020년 12월 17일
편집: Walter Roberson
2020년 12월 18일
Performance during simulation is important, but performance after the simulation is not as important. So save quickly and process later
function saveData(this, time)
if isfield(this, timeSeries)
this.ntimeSeries = this.ntimeSeries + 1;
else
this.ntimeSeries = 1;
this.timeSeries = cell(10000,2); %pre-allocate
end
this.timeSeries(this.ntimeSeries,:) = {time, this.structToSave};
end
The 10000 pre-allocation is a total guess about how many simulation steps you need. It is best to over-estimate: the overhead for unused rows is only 16 bytes per row, whereas the overhead for growing the cell can be high. (The code can be tweaked for lower overhead for growth.)
After the execution, this.ntimeSeries will record the number of entries actually used, and this.timeSeries will be an N x 2 cell array in which the first column is time information and the second is the struct you wanted to save.
In post-processing you can run though and do the saving.
To do the post-processing saving, I would suggest that you fieldnames() of the second column (the structs) and unique(), and then for each unique field name, run through all of the cell rows that saved that field, accumulate the time information (first cell) in the big vector, accumulate the contents of the vectors (making sure to concatenate along an appropriate dimension) into a 2D array for that variable, and addsample() all of it at one go -- only one addsample() for each different variable.
Of course if you are always saving exactly the same list of variables each time, the logic would be easier.
댓글 수: 2
추가 답변 (1개)
Nitin Kapgate
2020년 12월 16일
As the data is numeric/boolean, I would suggest that you to write the data at every step or periodically to a file (say a CSV file with columns for different signals and rows for every step). That would help in increasing the RAM available for simulation and improve the simulation speed. At the simulation progresses, the growing size of logged data can consume huge amount of RAM and slow down simulations.
댓글 수: 4
참고 항목
카테고리
Help Center 및 File Exchange에서 MATLAB Compiler에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!