サブ設定表におけるJMPの最大の問題 低迷長いテーブルをサブセット化するために複数の方法を使用しました(行> 100K、非常に一般的なサイズのデータテーブル)。サブセット化には行の選択が必要であるため、サブセット化する前にテーブルに対する操作が必要になるため、問題が発生します。そしてテーブルが長いと、非常に遅くなります。毎回新しいパラメータをサブセット化してプロットを生成するためにfoorループが必要な場合は特にそうです。
それはあなたが何を使用しても問題ではありません、それはただ遅いです。
行を選択
行を取得する
再:サブ設定テーブルのJMPの最大の問題.... 低迷なぜデータテーブルをサブセット化しているのですか。
必要のないデータを選択し、行の非表示状態と除外状態を設定し、プロットを作成して、次のグループに対して繰り返します。
再:サブ設定テーブルのJMPの最大の問題.... 低迷また、フィルタを使って同じタスクを実行できますか?
再:サブ設定テーブルのJMPの最大の問題.... 低迷データを選択すると問題が発生し、速度が遅くなることを明確に述べたと思います。
しかし、私はあなたが何を提案しているのか理解できないかもしれません。JSLの例を教えてください。それが物事をスピードアップするなら確かに私はしようとします。
ありがとう
RAM
再:サブ設定テーブルのJMPの最大の問題.... 低迷@Dan_Obermiller
フィルタをポップアップさせずにforループでそれを行うためにJSLを追加できますか?
ありがとう
再:サブ設定テーブルのJMPの最大の問題.... 低迷get行を使用しても、あるいは単に行を使用しても問題ありません。 実際にそれらを選択する必要はありません。
names default to here(1);
dt = open("$SAMPLE_DATA\Big Class.jmp");
rows = dt << Get Rows Where(:sex == "M");
dt_sub = dt << Subset(rows(rows));
行を選択するために何を使用していますか?遅いかもしれません。
再:サブ設定テーブルのJMPの最大の問題.... 低迷サブセット化せずにグループごとに分析を行う方法の簡単な例を示します。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/big class.jmp" );
// Reset the data table row states
dt << clear row states;
// Find the different values for Sex
Summarize( byGroup = By( :sex ) );
// Loop across the different groups and analyze them
For( i = 1, i <= N Items( byGroup ), i++,
// Reset the data table row states
dt << clear row states;
// Hide and Exclude the unwanted rows
dt << select where( :Sex != byGroup[i] );
dt << hide and exclude;
// Run the analysis
ow = dt << oneway( x( :age ), y( :height ) );
// Change the title of the report to show what data are in the analysis
Report( ow )[Outline Box( 1 )] << set title(
Report( ow )[Outline Box( 1 )] << get title || ": Sex=" || byGroup[i]
);
);
// Reset the data table row states
dt << clear row states;
再:サブ設定テーブルのJMPの最大の問題.... 低迷スクリプトでは、選択、サブセット化、レポートの作成など、ループの中でいくつかのことが行われているようです。 サンプルスクリプトを見ると役に立つと思います。 選択はどのように行われていますか?サブセットは元のデータテーブルにリンクされていますか?どのプラットフォームが作成されていますか?このループを何回実行しますか?サブセットテーブルがリンクされていて、レポートの自動再計算が有効になっている場合、以前のすべてのレポートがソーステーブルで発生した選択についての通知を受け取るため、反復ごとにプロセスが遅くなります。 これが問題である場合、各レポートはループの次の反復から分離されるため、他の人が提案したデータフィルタアプローチで問題が解決する可能性があります。
再:サブ設定テーブルのJMPの最大の問題.... 低迷 @vince_faller 現在私は同じ方法を使用しています。しかし、ファイルサイズが大きくなると、行を取得する行列も大きくなり遅くなります。
あなたがのような小さなデータテーブルを使用する場合
<SPAN class="token string">Big Class.jmp</SPAN>
、何でもうまくいく。問題はビッグデータファイルにあります。
再:サブ設定テーブルのJMPの最大の問題.... 低迷@txnelson
あなたのアプローチには2つの問題があります。
1。あなたは "select where(")を使っていますが、これは大きなテーブルの本当の根本的な原因です。selectを使用すると、それが行を選択するデータテーブル(私の場合> 300K行)を更新する操作になります。ファイルサイズにはカウントされないBigクラスを使用しているだけです。
2。これは、以下の状況では機能しません。
性別のX軸の身長データ= "M"と性別のY軸の身長データ= "F"を相関させる必要がある場合。
私はそれがあなたが今問題を理解するのに役立つことを願っています
ありがとう
再:サブ設定テーブルのJMPの最大の問題.... 低迷@danschikore
繰り返し回数ではありません。ファイルサイズが大きい場合は、行の選択が遅くなります。
再:サブ設定テーブルのJMPの最大の問題.... 低迷それで、100万行のこのテーブルで。 走るのに6分の1秒かかる。 おそらくスクリプトと関係があります。 好き @danschikore あなたがそれが遅く走ることの例のスクリプトを与えたならば、我々はあなたを助けることができるかもしれないと言った。
Names Default to Here( 1 );
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
あなたが6分の2秒の低迷を呼んでいるなら、私はあなたに何を言うべきかわからない。
再:サブ設定テーブルのJMPの最大の問題.... 低迷それで、100万行のこのテーブルで。 走るのに6分の1秒かかる。 おそらくスクリプトと関係があります。 ダンが言ったように、あなたがそれが遅く走ることの例のスクリプトを与えたならば、我々はあなたを助けることができるかもしれません。
Names Default to Here( 1 );
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
あなたが6分の2秒の低迷を呼んでいるなら、私はあなたに何を言うべきかわからない。
また、forループを使用して各パラメータの一連のプロットを生成しているのであれば、byを使用していない理由はありますか。
再:サブ設定テーブルのJMPの最大の問題.... 低迷選択基準が非常に複雑になっている可能性があります。 あなたが提供しない限り、我々はあなたをこれ以上援助することができません:
1。あなたの台本
2。データのサンプル(必要に応じて匿名化)
再:サブ設定テーブルのJMPの最大の問題.... 低迷@pmroz
@vince_faller
純粋な理論家ではなく、ここで実践されているだけです。
以下はいくつか追加された列があるスクリプトです。実行によっては、結果に最大2秒かかることがあります。表示時間の更新にも対応できるように、wait(0)も追加しました。
この時間は、2つのファイルを細分化するだけです。その後、いくつかの基準によって2つのファイルを結合するためにスクリプトが費やす追加の時間を追加できます。その後、二変量グラフを作成します。本当に遅くなります。
1 LOT分のデータで十分な速度です。しかし、もっとたくさん追加したら......
Try(close(datatable("Test"),nosave));
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>
再:サブ設定テーブルのJMPの最大の問題.... 低迷あなたが私たちにあなたが実際にしていることを言っていないので、私たちは理論的なことしかできません。
したがって、これを実行すると、1つのテーブル(2つではありません)の場合、約0.3秒から0.4秒かかりました。私はそれが完全に合理的だと思います。 サブセットと一緒に他の一連のアクションを実行している場合は、サブセットが遅いと言うのは公平ではありません。 forループでこれらを実行している場合、問題を引き起こしているのはおそらくforループで実行していることです。 あなたがスクリプトを実行しているなら、私はあなたがテーブルを見るためにユーザを必要としない限りwait(0)に入れないと言うでしょう。 実際には、不要な時間をレンダリングして使用しないように、それらを非公開/不可視にする必要があります。
あなたは実際に何をしようとしていますか?これは XY問題 。
あなたが私たちがあなたが実際に何をしているのかを私たちに知らせるならば、私たちはあなたがそれをスピードアップするのを助けることができるかもしれません。
再:サブ設定テーブルのJMPの最大の問題.... 低迷"get rows where"クエリはどれくらい複雑ですか。あなたが投稿したものはただ1つの値を探しているのでとても速いはずですが、私はより複雑なクエリではより遅いパフォーマンスを見ました。
これは、サブセットを非表示にしてから非公開にすることによる、サブセットコマンドの時間差を示す簡単な例です。
dt = data table("Probe");
t1 = hp time();
new_rows = dt << get rows where(:Process == "New");
t2 = hp time();
old_rows = dt << get rows where(:Process == "Old");
t3 = hp time();
//s1 = dt << subset(rows(new_rows), invisible);
s1 = dt << subset(rows(new_rows), private);
t4 = hp time();
//s2 = dt << subset(rows(old_rows), invisible);
s2 = dt << subset(rows(old_rows), private);
t5 = hp time();
tn = t2 - t1;
to = t3 - t2;
ts1 = t4 - t3;
ts2 = t5 - t4;
print("New rows: " || char(tn));
print("Old rows: " || char(to));
print("New subset: " || char(ts1));
print("Old subset: " || char(ts2));
見えないサブセットのタイミング:
"New rows: 1095"
"Old rows: 964"
"New subset: 3527"
"Old subset: 3366"
プライベートサブセットのタイミング:
"New rows: 949"
"Old rows: 883"
"New subset: 1861"
"Old subset: 1638"
非表示から非公開に変更するとサブセット時間が半分に短縮されました。
再:サブ設定テーブルのJMPの最大の問題.... 低迷私のコンピュータは本当に忙しいので、数字は少し異なりますが、リンクされたサブセットに変更して待機を削除すると効果的です。待機を解除することは目に見えないのとほぼ同じです。それは測定からテーブルのペイントツースクリーンを取得します。リンクされたサブセットを使用することは、多くのデータを移動する必要がなくなったため、大きなメリットがあります。
st=HPTIME();
rows = dt << Get Rows Where(:X == "C");
dt << Subset(rows(rows),outputtable("sub1"),"linked");
rows = dt << Get Rows Where(:X == "B");
dt << Subset(rows(rows),outputtable("sub2"),"linked");
//wait(0);
st=1e-6*(HPTIME()-st);
print(char(st)|| " Sec");
"2.534772秒" - wait(0)とのリンクは解除されています
"1.50435秒" - リンク解除
"0.467098秒" - リンク
再:サブ設定テーブルのJMPの最大の問題.... 低迷それの音から、あなたは列によってテーブルをサブセット化してそれらを一緒に結合しています。 例えば、あなたはそれを単純化しすぎたかもしれませんが、私がY(身長、性別== M)、X(身長、性別== F)をプロットしたい場合。 テーブルを分割するだけです。 これら2つのスクリプト、サブセットとジョインとスプリットは、スプリットが約3分の1の時間で実行されることを示しています。
names default to here(1);
dt = new table("Test",
add rows(1000000),
New column("sex", character, <<SET each="" value=""></SET>
また、Linkedでは、列名やその他のプロパティを変更できないので、列の名前を変更できないため、結合は少し見栄えが悪くなります。
再:サブ設定テーブルのJMPの最大の問題.... 低迷これが私がしていることの簡単な概要です。これが最も単純な形式のdatatableとscriptであり、実際のものと比べてまだ速いです。私は自分のコンプでこれを実行し、平均2秒得ました。これは悪くないと言う人もいます。しかし、人間の時間ではなくコンピュータの時間について話していることを忘れないでください。2秒はWW2の期間のようです。
これがどれほどひどい可能性があるかを知るためにこれを試すことができます: "add rows(1000000)"で行数を10倍に増減します。
Try(close(datatable("Test"),nosave));
dt = New Table("Test",
Add Rows(1000000),
New Column("X", Character, <<SET each="" value=""></SET>再:サブ設定テーブルのJMPの最大の問題.... 低迷最大の問題はあなたが更新/参加について言及しなかったことかもしれません。

再:サブ設定テーブルのJMPの最大の問題.... 低迷@こんにちは @ram_asra_gmail_ 、
これがスピードの面でどれだけの問題を引き起こすのか私にはわかりませんが、結果の面では確かにそうなるでしょう。Updateを使用した一致列の正しい指定は、Matching Columns()ではなくMatch Columns()です。 後者は更新テーブルを元のテーブルに行単位で接着します。実際には実際の一致を行うよりも速いでしょう。 結合を使用する場合は、「By Matching Columns()」です。
これがUpdateの正しい構文です。
datatable("sub1") << update(
With( Data Table( "Sub2" ) ),
Match Columns( :X1 = :X2, :P1 = :P2 )
);
確かに唯一起こっていることではありません、しかし、それが他の場所で発見されなかったならば私が言及するべきであると思いました!
@julian
再:サブ設定テーブルのJMPの最大の問題.... 低迷ええ、これはテーブルのサブセット化とはほとんど関係ありません。 このスクリプトを100行に減らしても7秒かかります。
私の最初の提案は、各二変量を独立して実行しないことです。 評価して追加しないように、プラットフォームとして(またはvlistbox()の内部で)実行してください。 それでは最後に見せてください。 それだけで3秒かかりました。 スクリプトが添付されています。
しかし、本当にデータテーブルを分割しようとしているようです。 分割機能はおそらくこれを行うよりも優れているでしょう。 何らかの理由でこのようにしなければならない場合。すべてのdt_sub1テーブルをby列とともに連結して、それらを一度にすべて実行します。 しかし、私はこれがトンを最適化することができると思います。
再:サブ設定テーブルのJMPの最大の問題.... 低迷で修正された構文で @julian 行数が10,000に減ったので、平均実行時間は 2.45 秒(私も二変量を見えなくした)。
更新を見えない結合に置き換えると、平均実行時間が 0.67 秒 これに重要なのは、二変量に必要ではない列を削除することでした。 落とさないと、かなり遅くなります。
結合がボトルネックの場合は、仮想結合の実行について検討することをお勧めします。 そのためには、まず結合のための固有キーとなる単一の列を作成する必要があります。
再:サブ設定テーブルのJMPの最大の問題.... 低迷このトリックは時間を短縮するのに役立つと思います。私はすでに見えない部分集合を利用しています。しかし、それはそれだけしかできません。
いくつかの実験をしてくれてありがとう。再:サブ設定テーブルのJMPの最大の問題.... 低迷 @Craige_Hales リンクされたサブセットは時間をかなり減らすことができるようです。しかし、私は2つのことを投稿したスクリプトで確認する必要があります。
1。繰り返すことで平均時間が改善されます。
2。私はまだXYチャートを作成するために2つのサブセットテーブルを結合することができます。
ありがとう