Leute,
Ich arbeite seit einiger Zeit an nicht standardmäßigen Join-Skripten, und es sieht so aus, als würde ich das viel tun müssen.
An diesem Punkt muss ich zwei Tabellen verbinden.
Zuerst hat man Messreihen mit verschiedenen Werkzeugen. Messungen werden in Sitzungen durchgeführt. Die Tabelle enthält jedoch nur Folgendes: Werkzeug, Ereigniszeit, Ergebnis .
Die zweite Tabelle enthält alle Informationen zu Sitzungen:
Werkzeug, Sitzungs-ID, Startzeit, Endzeit
Und ich muss eine Analyse der Messungen durchführen Session-ID
Grundsätzlich muss ich einzigartig sein Session-ID zu jeder Zeile in der ersten Tabelle.
Ich mache das derzeit so, dass ich durch jede Zeile der ersten Tabelle iteriere und nach der entsprechenden Zeile in der zweiten Tabelle suche Werkzeug ist abgestimmt und Ereigniszeit ist dazwischen Startzeit und Endzeit mit diesem:
currentStartEndInfoindex=dt2 << Get Rows Where(:tool==thisTool & :measstart < thisEventtime & :measend > thisEventtime);
woher dieses Werkzeug und thisEventtime sind Werkzeug und Zeit der ersten Tabelle, die ich durchläuft. Ich bekomme Unkenntnisse von der Liste mit Unikat Session-ID aus der zweiten Tabelle, die dieser Bedingung entspricht, und stellen Sie daraus eine Liste zusammen, die am Ende der Schleife zum Auffüllen der neuen Spalte in der ersten Tabelle verwendet wird. Diese Zeile "Get Rows Where" beansprucht 85% der Skriptlaufzeit.
Mit wenigen Millionen Zeilen in der ersten Tabelle und Hunderttausenden in der zweiten Tabelle dauert es etwas zwischen 8 und 16 Stunden.
Ich kann es mir nicht leisten, so lange zu laufen.
Daher Frage:
Gibt es eine Möglichkeit, das zu optimieren? Schließlich sieht es für jede Zeile in der ersten Tabelle immer wieder durch die zweite Tabelle - nicht sehr effizient.
Eine Idee, die ich habe, ist, die zweite Tabelle in Unterlisten nach Werkzeug aufzuteilen und dann "Get Rows Where" für jede Zeile in der Unterliste auszuführen, die diesem bestimmten Werkzeug entspricht. Hab keine Ahnung, wie man es am besten umsetzt.
Jede Hilfe wäre sehr dankbar.
Vielen Dank!
Hier ist eine erste Annäherung
aaa = New Table( "aaa", // the "event" table
Add Rows( 6 ),
New Column( "tool", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [100, 100, 100, 200, 200, 200] ) ),
New Column( "eventtime", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [11, 21, 12, 31, 41, 42] ) ),
New Column( "result", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [0, 1, 1, 1, 0, 0] ) ),
New Column( "sessionID_added", Numeric, "Continuous", Format( "Best", 12 ), Set Selected, Set Values( [., ., ., ., ., .] ) )
);
bbb = New Table( "bbb", // the start-end table
Add Rows( 4 ),
New Column( "tool", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [100, 100, 200, 200] ) ),
New Column( "sessionID", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [111, 222, 333, 444] ) ),
New Column( "startTime", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [10, 20, 30, 40] ) ),
New Column( "endTime", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [19, 29, 39, 49] ) )
);
// build two lookup tables that find all the rows associated with a tool
aaaRowsFromTool = Associative Array();
For( irow = 1, irow <= N Rows( aaa ), irow++,
If( !(aaaRowsFromTool << Contains( aaa:tool[irow] )), //
aaaRowsFromTool[aaa:tool[irow]] = Eval List( {irow} )//
, //
Insert Into( aaaRowsFromTool[aaa:tool[irow]], irow ) //
)
);
bbbRowsFromTool = Associative Array();
For( irow = 1, irow <= N Rows( bbb ), irow++,
If( !(bbbRowsFromTool << Contains( bbb:tool[irow] )), //
bbbRowsFromTool[bbb:tool[irow]] = Eval List( {irow} )//
, //
Insert Into( bbbRowsFromTool[bbb:tool[irow]], irow ) //
)
);
toolList = bbbRowsFromTool << getkeys;
For( itool = 1, itool <= N Items( toolList ), itool += 1,
toolno = toolList[itool];
// build a sorted list of event times+row numbers for this tool
aaaRowList = aaaRowsFromTool[toolno];
aaa << selectrows( aaaRowList );
aaasub = aaa << Subset( Selected Rows( 1 ), Selected columns only( 0 ), link to original data table( 1 ) );
//aaasub << sort( by( eventTime ), replace table );
timeMatrix = aaasub:eventtime << getAsMatrix;
bbbRowList = bbbRowsFromTool[toolno];
For( irow = 1, irow <= N Items( bbbRowList ), irow += 1,
bbbRow = bbbRowList[irow];
start = bbb:startTime[bbbRow];
end = bbb:endTime[bbbRow];
id = bbb:sessionID[bbbRow];
// find the eventTimes between start and end, for this tool
//aaasub<<SELECTWHERE></SELECTWHERE>
Es funktioniert zwar, ist aber immer noch zu langsam. Vielleicht möchten Sie die Tabelle "event" nach eventTime sortieren und loc () durch eine binäre Suche ersetzen.