2016-09-04 13 views
0

この投稿は、OpenHFTのよくある質問です。OpenHFT ChronicleMapのメモリ配置と制限

私はChronicleMapで考えていますが、多くの質問をしています。私はこの製品を検討しているほとんどのジュニアプログラマーが同様の考慮事項を持っていると確信しています。

メモリがこのAPIでどのように管理されているか説明しますか?

ChronicleMapは、そのデータを処理するために利用できるいくつかの注目すべきTBのオフヒープメモリリソースを宣言しており、そのことについて明確なビジョンを示したいと考えています。

500GBのHDと4GBのRAMのラップトップを備えたプログラマにお任せください。この場合、純粋な数学のsais - 利用可能な「交換された」メモリの総リソースは504GBです。 OSやその他のプログラムを半分にして、250GBのHDと2GBのRAMを残しておきましょう。 ChronicleMapが利用可能なリソースに相対的な数で割り当てることができる実際の利用可能なメモリについて詳しく説明できますか?

次の関連する質問はChronicleMapの実装に関連しています。

私の理解では、各ChronicleMapは、動作するメモリのチャンクを割り当て、最適なパフォーマンス/メモリの使用は、通過するデータの量を正確に予測できるときに達成されます。しかし、これはダイナミックな世界です。

(誇張なく可能)の例を設定します:

はKのマップ(キー)「都市」とそのV(値)と仮定 - (都市の)「説明」とのユーザー大きな制限を可能にします説明の長さ

まず、ユーザが入力した: - :次のユーザーが持ち去らます、今

ChronicleMap<Integer, PostalCodeRange> cityPostalCodes = ChronicleMap 
    .of(CharSequence.class, CharSequence.class) 
    .averageKey("Amsterdam") 
    .averageValue("City of bicycles") 
    .entries(5_000) 
    .createOrRecoverPersistedTo(citiesAndDescriptions); 

およびアッセイを書き込みK = "Amsterdam"V = "City of bicycles"とこのエントリはマップ を宣言するために使用され、それは、このようなペアのための先例を設定し、プラハ について彼がに渡す:K = "Prague"V = "City of 100 towers is located in the hard of Europe ... blah, blah... million words ..."

今、プログラマが最大5_000エントリを期待していたが、それは彼の手から取得し、エントリの何千があります。

この場合、ChronicleMapは自動的にメモリを割り当てますか?はいの場合は、このダイナミックなソリューションのChronicleMapsを宣言するより良いアプローチがありますか?いいえの場合は、このようなシナリオをどのように処理するかについてのアプローチ(コード例では最高)をお勧めしますか?

ファイルへの永続性はどのように機能しますか?

ChronicleMapsはRAMとディスクの空き容量を使い果たしますか?それを避けるベストプラクティス?

言い換えれば、過小評価や値(および/またはキー)の長さとエントリ数の過大評価の場合のメモリの管理方法について説明してください。

ChronicleMapで該当するのはどれですか?

  1. 私は、大きな塊(.entries(1_000_000).averageValueSize(1_000_000)と実際の使用量を割り当てる場合である - エントリ= 100、平均値サイズ= 100。

どうなりますか?:

1.1。 - すべて正常に動作しますが、大量の無駄なチャンクがあります - 未使用ですか?

1.2。 - すべてが正常に動作し、未使用のメモリがに提供されています:

1.2.1 - ChronicleMap

1.2.2 - ChronicleMap

1.2.3を使用してスレッド与えられた - 指定されたプロセス

1.2.4 - 与えられたJVM

1.2.5 - OS

1.3。 - 使用されていないメモリに何か他のことが起こった場合はどうか説明してください。

1.4。 - オーバーサイズの宣言は、永続化ファイルに対してどうしますか?

ケース1の
  • 反対 - 私は小さなチャンク(.entries(10).averageValueSize(10)を割り当て、実際の使用量は、エントリの1_000_000sであり、バイトの平均値サイズ= 1_000s どうなる?:
  • を。
    +0

    こんにちは。私たちのコミュニティは様々な性別で構成されており、あなたが「紳士」と呼んでいる人は除外されていると感じるかもしれません。とにかく挨拶を全くしていない投稿を好む。ありがとう! – halfer

    答えて

    1

    500ギガバイトHDと4ギガバイトのRAMをノートパソコンとプログラマに取り掛かることができます。この場合、純粋な数学のサイス - 。。使用可能なメモリが504ギガバイトである「スワップ」の総資源のは、OSや他のプログラムの半分を与えてみようと250GBのHDと2GBのRAMが残っています。実際の使用可能なメモリについて詳述できますかChronicleMapは利用可能なレゾうつ病?

    平均2ランダムディスク(合計4ランダムディスク操作)を読み取り、書き込みしてこのような条件下でクロニクルマップクロニクルマップと各操作に、非常に遅いであろう。 RocksDBまたはLevelDBのような従来のディスクベースのdbエンジンは、データベースサイズがメモリよりもはるかに大きい場合に効果的です。


    今、プログラマが最大5_000エントリを期待していたが、それは彼の手から取得し、エントリの何千があります。

    この場合、ChronicleMapは自動的にメモリを割り当てますか?はいの場合は、このダイナミックなソリューションのChronicleMapsを宣言するより良いアプローチがありますか?いいえの場合は、このようなシナリオをどのように処理するかについてのアプローチ(コード例では最高)をお勧めしますか? ChronicleMappBuilder.entries()を通じて設定数で割っ挿入エントリの実際の数が設定ChronicleMapBuilder.maxBloatFactor()より高くなくなるまで

    クロニクルマップメモリ​​を割り当てるであろう。 E.あなたは

    ChronicleMap<Integer, PostalCodeRange> cityPostalCodes = ChronicleMap 
        .of(CharSequence.class, CharSequence.class) 
        .averageKey("Amsterdam") 
        .averageValue("City of bicycles") 
        .entries(5_000) 
        .maxBloatFactor(5.0) 
        .createOrRecoverPersistedTo(citiesAndDescriptions); 
    

    としてマップを作成する場合はサイズは〜25 000になり、新しいエントリを挿入しようとし、上IllegalStateExceptionを投げ始めます。

    しかし、クロニクル地図maxBloatFactor()可能な最大が今ソリューション1000

    に人為的に制限されているので、実際のサイズは、はるかに構成されたサイズを超えて大きくなると、次第に遅くなる作品クロニクルの将来のサイズを設定することですentries()(およびaverageKey()およびaverageValue())を介して少なくともほぼ正確にマップします。

    可能性のあるクロニクルマップのサイズを事前に設定する必要があることは、使用上の問題であると認められています。すなわちThere is a way to fix this and it's on the project roadmap.


    、メモリが推定アンダーおよびオーバー推定値(および/またはキー)の長さとエントリ数の場合には管理されている方法を説明してください。

    キー/値の大きさの過小評価:スペースがエントリごとに、8バイト*過小評価係数〜、hash lookup areaに浪費されます。したがって、実際の平均エントリサイズ(key + value)が小さければ、かなり悪くなる可能性があります。e。 g。 50バイトで、それを20バイトとして構成した場合、〜8 * 50/20 = 20バイト、すなわち40%が無駄になります。平均エントリーサイズが大きければ、廃棄物も少なくなります。

    キー/値のサイズの過大評価 :あなただけのキーと値の平均サイズを設定する場合は、しかし、直接、実際のチャンクサイズを自動的に1/8、平均エントリサイズの1/4の間で選択されていないactualChunkSize()(キー+値)。実際のチャンクサイズはクロニクルマップの割り当て単位です。したがって、平均エントリサイズを〜1000バイトとして設定した場合、実際のチャンクサイズは125〜250バイトの間で選択されます。実際の平均エントリーサイズがちょうど100バイトであれば、多くのスペースを失います。過大評価が小さければ、予想される空間損失はデータサイズの約20%に制限されます。

    平均的なキー/値のサイズを過大評価する恐れがある場合は、actualChunkSize()を明示的に設定してください。

    エントリの過小評価:上記のとおり、。特別なスペースの無駄はありませんが、クロニクルマップの動作は遅く、過小評価は悪化します。

    エントリの数が過大である:ハッシュ検索領域でメモリが無駄になり、エントリあたり〜8バイト*過大評価係数。実際の平均エントリデータサイズに応じて、上記のキー/値のサイズの過小評価を参照してください。