インスタンスを分類するためのリクエストを取得するマルチスレッド Java アプリケーションを実行しています。多くのスレッドを同時に実行できるようにするために、私のアプリケーションはスレッド間でClassifier
オブジェクトとオブジェクトを共有しますInstances
。Instances オブジェクトには属性の関連データのみが含まれ、関連付けられたインスタンスはありません。
アプリケーションが分類リクエストをInstance
受け取ると、リクエストの属性データを使用してオブジェクトを作成し、事前に生成さInstances
れたオブジェクトを を使用してデータセットとして設定します。次にInstance.setDataset()
例を示します。
myNewInstance.setDataset(sharedInstances);
次にmyNewInstance
、共有に送信されClassifier
ます。
ほとんどの場合、うまくいくようです。ただし、2 つの同時要求が発生すると、 から例外がスローされることがありClassifier.distributionForInstance()
ます。残念ながら、エラー メッセージは明確ではありませんが、これらは 2 つの異なる例外です。
Caused by: java.lang.RuntimeException: Queue is empty
at weka.core.Queue.pop(Queue.java:194)
at weka.filters.Filter.output(Filter.java:563)
at weka.filters.unsupervised.attribute.PrincipalComponents.convertInstance(PrincipalComponents.java:626)
at weka.filters.unsupervised.attribute.PrincipalComponents.input(PrincipalComponents.java:812)
at weka.classifiers.meta.RotationForest.convertInstance(RotationForest.java:1114)
at weka.classifiers.meta.RotationForest.distributionForInstance(RotationForest.java:1147)
Caused by: java.lang.NullPointerException
at weka.filters.unsupervised.attribute.Standardize.convertInstance(Standardize.java:238)
at weka.filters.unsupervised.attribute.Standardize.input(Standardize.java:142)
at weka.filters.unsupervised.attribute.PrincipalComponents.convertInstance(PrincipalComponents.java:635)
at weka.filters.unsupervised.attribute.PrincipalComponents.input(PrincipalComponents.java:812)
at weka.classifiers.meta.RotationForest.convertInstance(RotationForest.java:1114)
at weka.classifiers.meta.RotationForest.distributionForInstance(RotationForest.java:1147)
ご覧のとおり、最新の場合、空のメッセージ文字列が表示されます。
私の理解では、オブジェクトを不変にすることはできず、同時実行性を最大限に活用するために、この部分をクリティカルセクションにラップしたくありません。コンストラクターを使用して、分類要求ごとに異なる「インスタンス」オブジェクトを作成しようとしましたが、Instances(Instances dataset)
異なる結果は得られませんでした。Classifier
オブジェクトの構築に時間がかかりすぎて、高速に応答する必要があるため (最大で 10 ~ 20 ミリ秒)、別のものを使用することはできません。私の理解では、問題はそこに依存していません。
問題は、同じ Instances オブジェクトを使用することにあると思います。インスタンスのドキュメントに基づいて、コンストラクターは、別のオブジェクトを作成しても問題が解決されなかった理由を説明するヘッダー情報への参照のみをコピーします。すべての属性をリアルタイムで調べずに、以前のオブジェクトに基づいて完全に異なるインスタンス オブジェクトを作成するオプションはありますか?
その他のパフォーマンス指向のソリューションも高く評価されます。
ありがとう!