Python オブジェクトを JMP に取得する最良の方法<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />15 分間で約 3 GB のデータを生成できる Python コードがあります。現在、データを「列」value1|value2|value3.. 行としてテキスト ファイルにストリーミングし、その後、テキスト ファイル全体を jmp が開くことができる csv に変換する後処理を実行します。CSV ファイルには、値を分割した後、最大 30,000 列と 100 ~ 10,000 行を含めることができます。
JMP へのデータの取得を高速化するために、テキスト データを Python セッションのメモリから jmp セッションに直接ストリーミングしたいと思います。
pycomを使用していくつかの自動化を試しましたが、pycomへの呼び出しが非常に遅いため、各行で反復して、その「行」で生成されるいくつかの値の正しい行を更新することが困難になっているようです。
別の方法はありますか? SQLiteメモリテーブル? JSLソケット?JMP Python API?
Re: Python オブジェクトを JMP に取得する最良の方法クレイグ
あまり役に立ちませんが、JMP 13 でもこの方法で動作します。JMP サポートに問い合わせる必要があります...おそらく JMP 14 で修正されるでしょう。
Re: Python オブジェクトを JMP に取得する最良の方法ご覧いただきありがとうございます。良い質問です。
ファイル名に空白が埋め込まれている Windows コマンドラインの動作と戦っていると思います。DOS ボックスでは、次のように引用符を使用します。

エスケープは少し見苦しくなりますが、JSL では次のようになります。
runprogram(executable("cmd.exe"), options({"/C","dir \!"c:\Users\chales\Saved Games\!""}), readfunction("text"))ここのオフィスには Python がありませんが、同じ動作になると予想されます。引用符を埋め込む必要がある場合、事態はさらに悪化します。私が取り組んでいる別のプロジェクトでは、の回答の 1 つに記載されているように「」を使用しました。 http://stackoverflow.com/questions/7760545/cmd-escape-double-quotes-in-parameter
プロジェクトのパス名を選択する場合は、空白を省略すると簡単になります。ファイルピッカーがある場合は、それらを許可する必要があります。
Re: Python オブジェクトを JMP に取得する最良の方法Run Program を使用する非常にクールな方法
解決策はありませんが、これはMacのJMP 12.1で機能します
f = Pick File();
x = RunProgram(
executable("/usr/bin/python"),
options(f),
readfunction("blob")
);
Re: Python オブジェクトを JMP に取得する最良の方法クレイジ@JMP
プログラムの実行に使用するオプションとファイル名に関係していると思われる問題が、プログラムの実行で発生していました。pick file() を使用するとクラッシュします。または、スペースを含むディレクトリをハードコーディングした場合。
これをダイナミックにするための提案はありますか?JMP 12.0.1を使用します。
例
f = pick file();
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options(f),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("/C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
//doesn't work
x = runprogram(executable("C:\Python34\python.exe"),
options("'C:/Google Drive/Work/Scripting/generate.py'"),
readfunction("blob")
);
//works
x = runprogram(executable("C:\Python34\python.exe"),
options("C:/Users/User/Desktop/generate.py"),
readfunction("blob")
);
Re: Python オブジェクトを JMP に取得する最良の方法以下に、1,000,000 double を約 2 秒で実行する完全な例を示します。
Python コードは double の配列を構築し、バイトのバイナリ文字列を作成し、そのバイトを stdout に書き込みます。必要に応じてファイルを使用することもできますが、バイナリ モード (wb) で開かれていることを確認してください。パック形式の先頭にある「>」は「ビッグエンディアン」を意味します。
「生成.py」
import arrayimport structimport mathimport sys# windows python messes up binary newlines...unless...if sys.platform == "win32": import os, msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)bigmat = array.array("d")for x in range(0,1000000): bigmat.append(math.sqrt(x))# %s is replaced by "1000000" ... d is for double precision 8 bytes eachbinary = struct.pack(">%sd" % len(bigmat), *bigmat)# print len(binary) # 8000000 bytessys.stdout.write(binary) JSL は runProgram を使用して Python プログラムを実行し、stdout から BLOB を読み取ります。BlobToMatrix は、ビッグ エンディアン データに一致するように「big」を指定します。Python プログラムを個別に実行してファイルを書き込む場合は、runProgram の代わりに LoadTextFile( ...BLOB ) を使用できます。それでも blobToMatrix が必要です。
「fetch.jsl」
x = runprogram(executable("C:\Python27\python.exe"), options("C:\Users\User\Desktop\pythonExample\generate.py"), readfunction("blob"));xx = blobToMatrix(x,"float",8,"big");// verify...ok="good";for(i=0,i if( xx[i+1] != sqrt(i), ok="bad"));show(ok); ok = 「良い」;
http://stackoverflow.com/questions/2374427/python-2-x-write-binary-output-to-stdoutバイナリ改行の問題に対する答えがありました。
Re: Python オブジェクトを JMP に取得する最良の方法次を使用して、PythonとJMPの間でIEEE浮動小数点データまたは整数を移動できると思います7.1. struct — バイトをパックされたバイナリデータとして解釈する — Python 3.5.0 ドキュメントPython 側では blobToMatrix 、JMP 側では blobToMatrix です。バイナリと文字の間で変換を行ったり、バイナリに戻す必要がないため、速度が大幅に向上します。 それらの間にはファイルまたはソケットを使用します。それらは同じマシン上にありますか?そうすれば少し楽になります。同じマシンではないですか? IEEE 浮動小数点ではない可能性があります...文字データの場合は別の処理が必要ですが、数値よりも簡単なはずです。