新しい列に文字値を入力する最速の方法は何ですか?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは。高度なテーブル連結を行うスクリプトがあり、元のテーブル名を示す「ソース列」を追加したいと考えています。 機能する方法はいくつかありますが、大きなテーブルではどれも遅くなります。 数式の方法も試しましたが、これも速くありませんでした。 他に使えるトリックはありますか?
以下の例は、私がやっていることと非常によく似ています。 データ テーブルのサイズが 100 万行になることは珍しいことではないため、大きなテーブルの場合はこの操作を数秒以内に短縮したいと考えています。
ありがとう、
マイク
dt =新しいテーブル() ;
dtList = { dt } ;
行数= 50000 ;
dt <<行を追加する(行数) ;
時間2 =今日() ;
もし( 0 、
dt <<新しい列( "テスト" 、キャラクター、それぞれの値を設定します(評価( dtList [ 1 ]) <<名前を取得する)) ; // 50k 行で 24 秒。
、
一時リスト= {} ;
のために(私= 1 、私<=行数、私++、一時リスト[私】 =評価( dtList [ 1 ]) <<名前を取得する) ; // 50k 行で 104 秒。
dt <<新しい列( "テスト" 、キャラクター、価値観(テンプリスト)) ;
) ;
見せる(評価(今日() -時間2 )) ;
Re: 新しい列に文字値を入力する最速の方法は何ですか?少なくともこの場合には、最初の例よりも簡単な方法があります。
start = Tick Seconds();
dt = 新しいテーブル();
dt << New Column( "テスト", 文字, "公称", 式( Eval( dt << getname ) ) );
dt << addrows( 1e7 );
dt << 式を実行;
stop = Tick Seconds();
Show( 停止 - 開始 );
データ テーブルへの NewColumn メッセージの Formula 引数は、もともと、次のような一般的なケースで非常に使いやすいように設計されていました。
計算式(身長+体重)
ここで、身長と体重はデータテーブルの列であり、加算は各行で実行する必要があります。したがって、Formula は引数を評価せず、未評価の式を列の数式として保存するだけです。
ただし...外部関数が評価(...)これは、上の簡単な例でわかります。Formula(...) 引数が処理されると、Eval が検索され、評価された結果が使用されます。JMP にはこれを行う他の場所もあります。また、substitute 関数など、他の場所でも使用されます。 Expr(...)式の引数の評価を防止します。
Re: 新しい列に文字値を入力する最速の方法は何ですか?ありがとうクレイジ。 元のメッセージを投稿した後、JMP のネイティブ concatenate() テーブル関数に「ソース列の作成」オプションがあることに気づきました。標準の連結機能を使用してコードを見つけ、赤い三角形をクリックすることができました。 / ソース スクリプトを実行して、どのように機能するかを確認してください。 このオプションはどこにも文書化されていないようです。私のスクリプトは元のテーブルの 2 つのコピーで動作するため、この中間ソリューションでは、元のテーブル名に戻すために少し操作が必要でした。元のテーブルであれば、これは良い解決策だったでしょう。
あなたのメソッドはかなりクリーンで、確かに高速です。 このようなものが必要になることはかなり頻繁にあるので、これをブックマークしておきます。 それらの機能の組み合わせの価値を学ぶ時期が来たと思います。 私はそれらが使われているのを見たことがありますし、何かを適切に動作させる方法だと言われたときにそれらを使ったこともありますが、いつそれを使用すべきかを認識できることはほとんどないようです。 今度は近かったのですが… 数式が機能したと思ったのですが(OPで述べた)、コードを見ると、式が数式に表示されているだけだったので機能しなかったことを思い出します。 このようなものが必要だとは思いましたが、どうすればよいかわかりませんでした。
スクリプトを最適化するために、どのタイプの関数を式でラップできるか、ラップする必要があるかに関する経験則はありますか? それとも、単に実行してタイミング解析を行って、遅い部分を修正することをお勧めしますか? 私はそうしています。
再度、感謝します、
マイク
PS ティック秒() について思い出させてくれてありがとう。 そのためには、today() よりも優れた関数があることを知っていました。
Re: 新しい列に文字値を入力する最速の方法は何ですか?start = Tick Seconds();
dt = 新しいテーブル();
評価(
Eval Expr(
dt << New Column( "テスト",
キャラクター、
「公称」、
Formula( Expr( dt << getname ) )
)
)
);
dt << addrows( 1e7 );
dt << 式を実行;
stop = Tick Seconds();
Show( 停止 - 開始 );
停止 - 開始 = 3.80000000004657; // 4 秒で 10,000,000 行
eval( evalExpr( ... expr( ... ) ... )) パターンは、JMP で式を操作する方法の 1 つです。これを理解するには、EvalExpr( ... ) から始めて、引数を調べて Expr( ... ) を見つけます。 Expr 部分が評価され、結果 (この場合は文字列) が Expr の代わりに残されます。EvalExpr の結果は式であり、外側の eval(...) によって評価される必要があります。
もっと早い方法があるかもしれません。あまり遠くまでは探索しませんでした。
