私は自家製のETLソリューションを持っています。変換レイヤーは、JavaScriptのスクリプトレットの設定ファイルで定義され、JavaのNashornエンジンによって解釈されます。ScriptContextを再利用するにはどうすればよいですか?
パフォーマンス上の問題が発生しています。おそらく何もできることはありませんが、誰かがNashornを助けている方法で問題を見つけることができれば幸いです。プロセスはマルチスレッドです。
私は1つの静的なScriptEngineを作成します。これは、CompiledScriptオブジェクトの作成にのみ使用されます。
private static ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
各レコードで再実行されるスクリプトレットをCompiledScriptオブジェクトにコンパイルします。
public static CompiledScript compile(Reader reader) throws ScriptException {
return ((Compilable) engine).compile(reader);
}
このメソッドを使用してコンパイルされた2つの標準JavaScriptライブラリがあります。
各レコードについて、ScriptContextが作成され、標準ライブラリが追加され、レコードの値がバインディングとして設定されます。
public static ScriptContext getContext(List<CompiledScript> libs, Map<String, ? extends Object> variables) throws ScriptException {
SimpleScriptContext context = new SimpleScriptContext();
Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
for (CompiledScript lib : libs) {
lib.eval(context);
}
for (Entry<String, ? extends Object> variable : variables.entrySet()) {
bindings.put("$" + variable.getKey(), variable.getValue());
}
return context;
}
次に、レコードのコンテキストを使用してレコードを変換し、フィルタを評価します。すべてがCompiledScriptを使用します。
public static String evalToString(CompiledScript script, ScriptContext context) throws ScriptException {
return script.eval(context).toString();
}
ScriptContextに対するCompiledScriptの実際の実行は非常に高速ですが、ScriptContextの初期化は非常に遅いです。残念ながら、少なくとも私が理解する限り、これは束縛のセットごとに行われなければならない。レコードがフィルタと一致する場合は、同じレコードに対してもう一度コンテキストを再構築する必要があります。今回は、一致したフィルタからの追加のバインディングを使用します。
私はScriptContextを作成するたびに2つの標準ライブラリを再実行する必要がありますが、これらのライブラリが実行された後、バインディングが追加される前にScriptContextをクローンするスレッドセーフな方法が見つかりませんでした。また、2つの標準ライブラリを再実行して、フィルタと一致するレコードにすべてのバインディングを再接続する必要がありますが、レコードのScriptContextをクローンして別のバインディングを変更せずに追加するスレッドセーフな方法が見つかっていないオリジナル。 jvisualvmによると、私のプログラムの時間の大半は
jdk.internal.dynalink.support.AbstractRelinkableCallSite.initialize() (70%)
jdk.internal.dynalink.ChainedCallSite.relinkInternal() (14%)
に費やされ
私は、このユースケースのパフォーマンスを向上するのに役立つ可能性がありNashornに任意の洞察力をいただければ幸いです。ありがとうございました。
http://stackoverflow.com/a/30159424/3920048 – Misha