問題タブ [chronicle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
chronicle - 複数のスレッドでクロニクル キューに書き込む -> java.nio.BufferOverflowException
Apache Aries Remote Service Admin で記録キューを使用するアダプターを作成しています。単一のスレッドのみを使用すると、正常に機能します。複数のスレッドを使用すると、以下のような例外が発生します。
私が間違っていることは何ですか?
参考までに、これは私のコードです: https://github.com/cschneider/rsa-chronicle-provider/blob/master/src/test/java/org/apache/aries/rsa/provider/chronicle/ChronicleProviderTest.java
エグゼキューターのスレッド数を増やすと、例外が発生する可能性があります。
java - ChronicleMap のマルチマップ
ChronicleMap のマルチマップに関するChronicleMap の GitHubには、間違いなく免責事項があります。
クロニクル マップは...
... 副次索引はありません。
マルチマップ。
ChronicleMap<K, Collection<V>>as multimapを使用することは技術的には可能ですが、多くの場合、問題が発生します...
残念ながら、これは私の使用例の 1 つであり、(ChronicleMap を使用して) オフヒープ ストレージを使用するのが最も簡単な方法です。
ピザに関する私の問題を説明してみましょう。100,000 種類のピザがあります。各ピザには ID があり、さまざまなトッピングとクラストがたくさんあります。3 つのアクセス パターンがあります。
- IDでピザをくれ。
- 特定のトッピングのピザをすべて教えてください。
- 特定のクラストを持つすべてのピザを教えてください。
を使用してピザを簡単に保存できますChronicleMap<UUID,Pizza>。しかし、それは 1 つのアクセス パターンにすぎません。トッピングやクラストが一致するピザを見つけるために、すべてのピザを繰り返し処理する必要はありません。だから、私はのようなものを保存したいと思いChronicleMap<Topping,Collection<UUID>>ますChronicleMap<Crust,Collection<UUID>>。
次に、誰かがペパロニを含むすべてのピザを求めてきたら、トッピングの ChronicleMap を検索して一致するピザの UUID を取得し、次にメインのピザ マップを検索します。
しかし、上で引用した文書は私を怖がらせます。そのようなことがしばしばもたらすこれらの「問題」が何であるかを誰かが知っていますか? 私にとってはうまくいっているように見えますが、なぜこれを行うべきではないのでしょうか? ChronicleMap がシリアル化されたオブジェクト、特にコレクションを格納する方法と関係がありますか?
潜在的な質問に対するいくつかの追加メモ:
- コレクションの更新も必要になるピザを後で追加する可能性があります。
- 多くのプロセスがこれらの操作を実行しようとしているため、基本的な ConcurrentMap ではなく、ChronicleMap を介してマップを共有する必要があります。
chronicle - クロニクル マップはプリミティブの配列をサポートしていますか?
次のようなものがあるとします。
この場合、長い[]が使用できないように見えるため
(field type class [Lnet.openhft.chronicle.core.values.LongValue; is not supported: not a primitive, enum, CharSequence or another value interface例外が発生しています)
奇妙に聞こえますが、私はsmthを見逃していますか? そのようなオブジェクトを操作するための最良のアプローチは何ですか? 独自のシリアル化を実装しますか?
chronicle - 同じプロジェクトで Map3 とエンジンを使用していますか?
間違っていたら訂正してください。しかし、同じパッケージ名のために同じプロジェクトで Map3 と Engine を使用しようとすると、問題が発生するように見えますか? それを行う方法はありますか?
PS サイド ノート - 依存関係の問題により、エンジン マスター ブランチ (少なくとも「デモ」モジュール) を現在コンパイルできないように見えますか?
java - ChronicleMap は、値のサイズが大きく変動する場合に JVM をクラッシュさせる
これまでのところ、使いたいと思っていたことのほとんどに使用して成功してChronicleMapおり、ほとんどのデータセットは問題なく機能しています。私たちが持っているユースケースの 1 つは、それをマルチマップとして使用することで、そうすることでほとんどの問題をカバーします。Map<String,Set<Integer>>この場合は特にとして使用しています。ただし、いくつかの興味深い JVM クラッシュが発生しており、決定論的なパターンを見つけるのに苦労しているため、それらを回避できます。
したがって、すべてを に入れる前に、Set<Integer>全体ChronicleMapを JVM に持っているので、断片化を減らすために一度に書き込みます。完全にメモリ内にあるため、最大サイズと平均サイズを判断でき、を使用して適切なSet<Integer>サイズを簡単に設定できます。ほとんどの場合、これで問題なく動作します。ChronicleMapChronicleMapBuilder.averageValueSize
ただし、場合によっては、 のサイズがSet<Integer>平均から大きく外れると、JVM がクラッシュします。たとえば、平均サイズが 400 であっても、20,000 個の整数を含む外れ値セットが存在する可能性があります。400 個の整数のセットのシリアル化された平均サイズを使用してマップのサイズを変更することもできますChronicleMap。非常に大きなサイズのリストに到達するまで、問題なくデータが取り込まれ始めます。
問題は、平均からどれだけ逸脱できるかをどのように把握すればよいかということです。平均が実際に平均であることを望んでいましたが、それを超えるとJVMが停止する最大値があるようです。
大きなセットを小さなセットに分割するアルゴリズムを考案しました (たとえば、キーが AAA の場合、キーは AAA:1、AAA:2、... AAA:n になります)。分割セットのサイズは、平均サイズの 10 倍でした。つまり、平均サイズが 500 で、セットが 20,000 の場合、それを 4 つの 5,000 (500 * 10) 要素セットに分割します。
これはほとんどの場合うまくいきましたが、別の興味深いケースに遭遇し、この分割でさえ十分ではありませんでした。係数を平均サイズの 5 倍に減らしたところ、再び機能するようになりました...しかし、それが十分に小さいことをどのように確認できますか? ソースの問題を知ること、またはその原因を正確に特定する方法が最善の方法だと思いますが、残念ながら、なぜChronicleMapここで苦労しているのかわかりません。
また、FWIW、古いバージョンの 2.1.17 を使用しています。これが新しいバージョンで修正されたバグである場合、バグについて少し詳しく知りたいのですが、独自の手段 (セットを分割するなど) で回避できるかどうかを知りたいのですが、引き続き 2.1.17 を使用します (後でアップグレードします; ボートをあまり揺さぶりたくないだけです)。
java - 選択可能なクロニクルインデックスとデータファイル
私たちは、低レイテンシのメッセージング b/w コンポーネントの概念実証として、Chronicle HFT を試しています。クロニクル-1.7.2.jarを使用しています
リーダーとライターがいて、ライターはクロニクルへの抜粋を書き続け、リーダーは忙しい while ループでそれを読み続けます。
記録ファイルに利用可能なデータがある場合、epoll でリーダーをフックして選択可能にするのに問題があります。通常、DatagramChannel データの可用性を選択します。
クロニクルにデータが書き込まれている場合に、リーダーを選択可能にし、コールバックを登録する方法に光を当ててください。
java - クロニクル マップで実行される操作のオブザーバー パターン
Chronicle Map をデータストア/データ キャッシュとして使用することを楽しみにしており、同じボックスで実行されている他の JVM プロセスと共有して、他の各 JVM プロセスのメモリ フットプリントを削減する予定です。そうしないと、各 JVM プロセスが同じデータをロードします。エントリがデータストアに追加または削除されるたびに、各 JVM プロセスで通知を受け取ることはできますか? それは本当にメモリフットプリントを減らすつもりですか? いずれにせよ、各 JVM プロセスはいくつかのドメイン オブジェクトを作成するためです。
API とドキュメントを見ましたが、ユース ケースを実装する方法があまり明確ではありませんでした。MapMethods と remoteOperations がそれに最も近づきました。意図した機能を実現するための正しい方法を知りたいのですか、それとも間違っていますか。
私が正しい軌道に乗っている場合、mapMethods/remoteOperations は、メインのデータストアではなくオブザーバー側でのみ提供する必要があると推測しています。私は正しいですか?
java - 接続イベントをキャッチするには?
クロニクルの接続インターフェースについて本当に混乱しています。それに関するテストコードやソースコードが見つかりませんでした。
切断および接続中のイベントをキャッチしたい。
私のセットアップは(バニラクロニクル3.6.2。)のようになります。
2 つの同一のプロセスは、互いに接続します。
ソース::
テーラー::