Vectorize and/or preallocate my query

Hi together,
is there anybody who might help me to vectorize and/or preallocate my query?
I really don't know how..
Thank you so much for your help.
function myCallback (hTimer,~)
try
addpath('C:\Users\MoneyM8ker\Documents\IBMatlab\Data\a')
bVW = readtable('Schotter_OptionsscheineL1.csv');
symbolListB = bVW.localSymbol;
bn = length(symbolListB);
bVW(1:bn,:);
conn = database('Test','Test','Test');
tablename = 'Kurs_Optionsschein_Detail';
tnow = {datestr(now, 'yyyy-mm-dd HH:MM:SS.FFF')};
whereclausen = ['WHERE Import = ''L1'''];
update(conn,{'Simulation_Zeitstempel'},{'Time'},tnow,whereclausen);
yVW=0;
i=1;
for yVW = 1:bn
optionsname = symbolListB(i);
stro= optionsname;
stro1 = char(stro);
DataOption(i) = IBMatlab('action','query', 'localsymbol',stro1, 'QuotesNumber',-1);
w=0;
for w = 1:2
try
i;
w;
dataTimestampA = {[datestr(DataOption(i).data.dataTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
bidSizeTimestampA = {[datestr(DataOption(i).data.bidSizeTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
askSizeTimestampA = {[datestr(DataOption(i).data.askSizeTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
eval(['C = ' num2str(DataOption(i).data.bidPrice(w)) ';']);
eval(['D = ' num2str(DataOption(i).data.askPrice(w)) ';']);
data = table(dataTimestampA, bidSizeTimestampA, askSizeTimestampA,symbolListB(i),C,D, 'VariableNames',{'dataTimestamp', 'bidSizeTimestampA','askSizeTimestampA','Optionsschein','bidPrice','askPrice'});
sqlwrite(conn,tablename,data) ;
catch e
continue;
fprintf(1,'The identifier was:\n%s',e.identifier)
fprintf(1,'There was an error! The message was:\n%s',e.message)
return;
end
end
i=i+1;
end;
catch e %e is an MException struct
fprintf(1,'The identifier was:\n%s',e.identifier)
fprintf(1,'There was an error! The message was:\n%s',e.message)
% more error handling...
end
close(conn);
end
Kind regards
Oliver

4 Kommentare

Jan
Jan am 21 Okt. 2022
Bearbeitet: Jan am 21 Okt. 2022
What is the purpose of vectorization and pre-allocation? Both do not en in itself. Do you want to accelerate the code?
This is a very bad idea:
addpath('C:\Users\MoneyM8ker\Documents\IBMatlab\Data\a')
bVW = readtable('Schotter_OptionsscheineL1.csv');
Adding a folder on top of the path can cause serious troubles, if you shadow a built-in function. If you do this to import a data file, just use a full path:
Folder = 'C:\Users\MoneyM8ker\Documents\IBMatlab\Data\a')
bVW = readtable(fullfile(Folder, 'Schotter_OptionsscheineL1.csv'));
Avoid EVAL:
eval(['C = ' num2str(DataOption(i).data.bidPrice(w)) ';']);
% Better:
C = DataOption(i).data.bidPrice(w));
Neither vectorization nor pre-allocation seems successful strategies for speeding up the function. Use the profiler to find the bottleneck of the code.
Avoid uselues code like this:
i;
w;
dpb
dpb am 21 Okt. 2022
On top of @Jan's always pertinent advice, it appears the only place preallocation would come into play in the above would be for the DataOption array -- and it doesn't appear there's any reason/need for it to be an array at all; the code as constructed consumes each entry inside the inner loop for each pass of the outer loop, but the variable content is never referenced later so there's no apparent need to not just redefine the variable each pass.
Oliver Kerzmann
Oliver Kerzmann am 21 Okt. 2022
Thank you so much for your fast help.
I'll update my code and will send the results.
Have a nice weekend.
Kind regards
Oliver
dpb
dpb am 21 Okt. 2022
Bearbeitet: dpb am 22 Okt. 2022
function myCallback (hTimer)
% the function would be more general if the following were provided
% arguments to the function, not hardcoded that requires edit to code
% itself to use different location/file...
rootpath='C:\Users\MoneyM8ker\Documents\IBMatlab\Data\a';
filename='Schotter_OptionsscheineL1.csv';
try
bVW = readtable(fullfile(rootpath,filename));
symbolListB = bVW.localSymbol;
% length() is a dangerous function -- it is max(size(x)) use explicit
% size argument dimension desired...
bn = length(symbolListB);
% use variables to store the text strings -- again, only change data, not code
conn = database('Test','Test','Test');
tablename = 'Kurs_Optionsschein_Detail';
% datestr is deprecated, use new datetime functions
tnow = {datestr(now, 'yyyy-mm-dd HH:MM:SS.FFF')};
whereclausen = ['WHERE Import = ''L1'''];
update(conn,{'Simulation_Zeitstempel'},{'Time'},tnow,whereclausen);
%yVW=0; % redefined by loop index immediately -- wasted effort
%i=1; % unneeded; no need to save DataOption in array
for yVW = 1:bn
optionsname = char(symbolListB(i));
%stro= optionsname; % needless extra variables
%stro1 = char(stro);
DataOption=IBMatlab('action','query','localsymbol',optionsName, 'QuotesNumber',-1);
%w=0; % redefined by loop index immediately -- wasted effort
for w = 1:2
try
dataTimestampA = {[datestr(DataOption.data.dataTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
bidSizeTimestampA = {[datestr(DataOption.data.bidSizeTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
askSizeTimestampA = {[datestr(DataOption.data.askSizeTimestamp(w),'yyyy-mm-dd HH:MM:SS.FFF')]};
data = table(dataTimestampA, bidSizeTimestampA, askSizeTimestampA,symbolListB(i), ...
DataOption.data.bidPrice(w),DataOption.data.askPrice(w), ...
'VariableNames',{'dataTimestamp', 'bidSizeTimestampA','askSizeTimestampA','Optionsschein','bidPrice','askPrice'});
sqlwrite(conn,tablename,data) ;
catch e
continue;
fprintf(1,'The identifier was:\n%s',e.identifier)
fprintf(1,'There was an error! The message was:\n%s',e.message)
return;
end
end
%i=i+1;
end;
catch e %e is an MException struct
fprintf(1,'The identifier was:\n%s',e.identifier)
fprintf(1,'There was an error! The message was:\n%s',e.message)
% more error handling...
end
close(conn);
end

Melden Sie sich an, um zu kommentieren.

Antworten (1)

Oliver Kerzmann
Oliver Kerzmann am 24 Okt. 2022

0 Stimmen

Hi togther,
the code is running much faster now. Thank you very much for the fast help.
But there's an other thing.. Time by time it's getting slower and slower and the RAM runs full.
Restarting Matlab helps, but is there an easier or more compfortable way?
Thank you and kind regards
Oliver

1 Kommentar

dpb
dpb am 24 Okt. 2022
I don't know just what you're doing; I don't have and never used the SQL connection with MATLAB so no experience there.
What I'd say is it would probably be better if you can construct your queries to return the wanted data in large chunks instead of what it appears is a record-by-record manner.
You could use the profiler to see just what it is that is the time hog...

Melden Sie sich an, um zu kommentieren.

Kategorien

Produkte

Version

R2019a

Gefragt:

am 21 Okt. 2022

Kommentiert:

dpb
am 24 Okt. 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by