6

任意のリレーショナル データベース テーブルの内容を表現および格納するために使用できる JVM データ構造 (Java/Scala) を設計したいと考えています。データ構造は高速で (gc を多用しすぎず、キャッシュに適していない)、メモリ効率が高い必要があるため、より大きなテーブルを RAM に収めることができます。

メモリ効率の良い解決策の 1 つは、各列をプリミティブ配列に個別に格納することですが、同じ行のアイテムが一緒に格納されないため、キャッシュの使いやすさが心配です。N 列の行では、列の幅に関係なく、N キャッシュ ミスが発生します。

もう 1 つの解決策は、各要素がフィールドを表し、取得時に正しい型にキャストされるオブジェクト配列に各行を格納することですが、これには数値型をボックス化された形式で格納する必要があるため、メモリ効率があまり良くありません。また、おそらくキャッシュ効率も良くありません。

もう 1 つの解決策は、実際のデータベースが行をシリアル化するのと同じ方法で、各行のデータをバイト配列にレイアウトし、必要なバイト数だけを使用することです。これはキャッシュにやさしくメモリ効率が良いですが、アクセスごとのシリアライゼーション/デシリアライゼーションのコストが気になります。

最善の方法は何ですか?

4

3 に答える 3

1

4 番目の解決策は、各行のデータをバイト配列ではなく文字列として格納することです。これにより、ほとんどのデータが文字列である場合、ほとんどの場合、シリアル化のコストを回避できます。

これにより、デバッグも容易になり、プラットフォームに依存しなくなります。もちろん、いくつかの制限があります。たとえば、float をそのまま表すことはできませんが、SQL DECIMAL 形式に似た形式で格納できます。

どのソリューションもトレードオフになります。

編集しかし、私はあなたの場合にはバイト配列ソリューションを好むでしょう:行ごとに1つのバイト配列。これは、固定サイズの行に対して最もキャッシュに適しているはずです。ただし、可変サイズの行のソリューションも提供する必要があります。低レベル言語はそのタスクにより適しているようです。C では、2 つの形式を定義できます。テーブル メタデータに列オフセットが含まれる固定サイズの行 (たとえば、列 1: バイト 0..31、列 2: バイト 32..127)など)、および行自体に列のサイズが含まれる 2 番目の可変サイズの行形式 (たとえば、バイト 1..3 にサイズが含まれ、次のバイト数にデータが含まれ、別の 4 バイトにサイズが含まれ、データに続く)等々)。

于 2010-09-19T19:22:51.537 に答える
0

なぜhsqldbまたはh2を使用しないのですか?

どちらもメモリ内モードをサポートし、純粋なJavaです。SQLを使用してアクセスする必要がありますが、その一方で、独自の結合を実装する必要はありません。

どちらもオープンソースであるため、これをパフォーマンスのベースラインとして使用し、列ごと/行ごとのデータ構造を独自に実行する方が高速で、努力する価値があるかどうかを確認することもできます。

于 2010-08-07T00:07:34.117 に答える
0

これを行う目的は何ですか?車輪を再発明するよりも、データベースから取得したデータを (マップ先のオブジェクトとして) EhCache、OSCache、memcache などの何らかのキャッシュ レイヤーに単純に格納する方がよいでしょう。

于 2010-08-06T17:36:53.200 に答える