みんな、
私は非標準の結合スクリプトにかなりの時間取り組んできました、そしてそれは私がそれをたくさんする必要があるように見えます。
この時点で私は2つのテーブルを結合する必要があります。
1つ目は、さまざまなツールに関する一連の測定値です。測定はセッションで行われます。しかし、テーブルには以下のものしかありません。ツール、eventtime、結果 。
2番目のテーブルにはセッションに関するすべての情報があります。
ツール、sessionid、開始時間、終了時間
そして私は測定の分析をする必要があります。セッションID
基本的に、私はユニークに参加する必要がありますセッションID 最初のテーブルの各行に。
私が現在行っている方法は、最初のテーブルの各行を繰り返して、2番目のテーブルの対応する行を検索することです。ツール一致しているイベントタイム間にある始まる時間そして終了時間これを使って:
currentStartEndInfoindex=dt2 << Get Rows Where(:tool==thisTool & :measstart < thisEventtime & :measend > thisEventtime);
どこで thisTool そして thisEventtime 私が繰り返している最初のテーブルのツールと時間です。リストのインデントが一意であるセッションID この条件に一致する2番目のテーブルから、ループの最後に最初のテーブルの新しい列を作成するために使用されるそれらからリストを組み立てます。この "Get Rows Where"行は、スクリプト実行時間の85%を占めます。
現在、最初のテーブルに数百万行、2番目のテーブルに何十万行もあるので、8〜16時間かかります。
こんなに長く走る余裕はありません。
したがって、質問:
それを最適化する方法はありますか?また、最初のテーブルの各行について、2番目のテーブルを何度も見ていますが、あまり効率的ではありません。
私が持っている一つのアイデアは、ツールによって2番目のテーブルをサブリストに分割してから、その特定のツールに対応するサブリストの各行に対して "Get Rows Where"を実行することです。しかし、それをどのようにして最良に実装するかはわかりません。
任意の助けは大歓迎です。
ありがとうございます。
これが最初の近似です
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>
それは動作しますが、それでもまだ遅すぎます、"event"テーブルをeventTimeでソートし、loc()をバイナリルックアップに置き換えることを利用したいかもしれません。