I am using FastLineSeries to plot arrays of up to 1,000,000 points, but I plot them as they are acquired in a data acquisition system, about 2000 pts every 100 msec. To do this I am using FastLineSeries->AddXY() to add points every 100 msec, and FastLineSeries->Clear() to clear the chart every minute or so.
When I watch the "Mem Usage" value in the Windows Task Manager I see it slowly increase as the plotting begins (indicating additional memory allocation) and this continues up to when the plot is Cleared() at which time the "Mem Usage" rapidly drops down (deallocation). Then gradually the "Mem Usage" begins increasing again when plotting again starts. This repeated deallocation/reallocation of memory is very wasteful.
Is there any way I can control when the deallocation occurs, but have allocation continue if more is eventually needed?
Alternatively, I understand I could use Direct Dynamic Arrays and use SetLength() to directly allocate the memory once and maybe change its size when needed.
Do I need to upgrade from version 6.0 to 7 to use SetLength() and Direct Dynamic Arrays?
I am using C++Builder 6 and VCL TeeChart Pro 6.0.
Thank you.
Bill Anderson
Stopping FastLineSeries deallocation/reallocation of memory
-
- Newbie
- Posts: 6
- Joined: Wed Jul 02, 2003 4:00 am
Hi Bill,
well, AddXY method is the slowest way to add points to series. The best solution would be to use dynamic arrays. Here is the code you can use with the TeeChart Pro v6 :
well, AddXY method is the slowest way to add points to series. The best solution would be to use dynamic arrays. Here is the code you can use with the TeeChart Pro v6 :
Code: Select all
void __fastcall TDynArrays::Button1Click(TObject *Sender)
{
// TChartValues
DynamicArray<double> X;
DynamicArray<double> Y;
// number of points }
int Num = 10000;
// allocate our custom arrays }
X.Length = Num;
Y.Length = Num;
// fill data in our custom arrays }
X[0] = 0;
Y[0] = random(10000);
for (int t=1; t<Num;t++)
{
X[t] = t;
Y[t] = Y[t-1]+random(101)-50;
}
// set our X array }
Series1->XValues->Value =(TChartValues)(X); // <-- the array
Series1->XValues->Count = Num; // <-- number of points
Series1->XValues->Modified = true; // <-- recalculate min and max
// set our Y array }
Series1->YValues->Value = (TChartValues)(Y); // <-- the array
Series1->YValues->Count = Num; // <-- number of points
Series1->YValues->Modified = true; // <-- recalculate min and max
Chart1->UndoZoom(); // <-- remove zoom (optional)
// Show data
Series1->Repaint();
}
Pep Jorge
http://support.steema.com
http://support.steema.com
-
- Newbie
- Posts: 6
- Joined: Wed Jul 02, 2003 4:00 am
Stopping FastLineSeries deallocation/reallocation of memory
Thanks Pep,
I'll try this out now. May have some more questions in the future, because I plot my part of my graph every 100 msec rather than all at once.
Cheers,
Bill
I'll try this out now. May have some more questions in the future, because I plot my part of my graph every 100 msec rather than all at once.
Cheers,
Bill
-
- Newbie
- Posts: 6
- Joined: Wed Jul 02, 2003 4:00 am
Stopping FastLineSeries deallocation/reallocation of memory
Hi Pep,
I earlier sent a message to the Forum on using FastLineSeries to plot arrays of up to 1,000,000 points, but I plot them as they are acquired in a multitasking data acquisition system in real-time, at about 2000 pts every 100 msec.
You suggested that I use Dynamic Arrays instead of the AddXY() method.
However, I found that the requirement to Repaint() the WHOLE array (ie when adding the last 2000 pts to a Dynamic Array of 1,000,000 pts) made it much slower than my AddXY() method. The Repaint() of the WHOLE Dynamic Arrays takes about 50 msec!
I have two questions now...
1) When using Dynamic Arrays, is there any way to add say 2000pts at the end of the arrays and then plotting ONLY the NEW POINTS ADDED (like happens with the AddXY() method)?
2) Getting back to my original question... Is there any way I can control the minimum amount of memory that a FastLineSeries has so that the wasteful deallocation/reallocation cycle does not have to occur when plotting large plots using the AddXY() method 100msec at a time in a multitasking environment?
I recall reading that there was such a function, but I can't remember it and can't find it in your documentation.
Thanks,
Bill
I earlier sent a message to the Forum on using FastLineSeries to plot arrays of up to 1,000,000 points, but I plot them as they are acquired in a multitasking data acquisition system in real-time, at about 2000 pts every 100 msec.
You suggested that I use Dynamic Arrays instead of the AddXY() method.
However, I found that the requirement to Repaint() the WHOLE array (ie when adding the last 2000 pts to a Dynamic Array of 1,000,000 pts) made it much slower than my AddXY() method. The Repaint() of the WHOLE Dynamic Arrays takes about 50 msec!
I have two questions now...
1) When using Dynamic Arrays, is there any way to add say 2000pts at the end of the arrays and then plotting ONLY the NEW POINTS ADDED (like happens with the AddXY() method)?
2) Getting back to my original question... Is there any way I can control the minimum amount of memory that a FastLineSeries has so that the wasteful deallocation/reallocation cycle does not have to occur when plotting large plots using the AddXY() method 100msec at a time in a multitasking environment?
I recall reading that there was such a function, but I can't remember it and can't find it in your documentation.
Thanks,
Bill