15

Scala では、ペア (X, Y) の非常に長いリストが必要です。サイズが大きすぎてメモリに収まりません (ただし、ディスクにはうまく収まります)。

  • すべての更新操作はコンス (先頭に追加) です。
  • すべての読み取りアクセスはヘッドから始まり、事前に決定されたペアが見つかるまでリストを順番にトラバースします。
  • ほとんどの読み取りアクセスは同じデータを何度も保持するため、キャッシュは優れています。

つまり、これは基本的に「disk-persisted-lazy-cacheable-list」™ です。

独自の展開を開始する前に入手する方法についてのアイデアはありますか?


補遺:はい.. mongodb、またはその他の組み込み不可能なリソースはやり過ぎです。この特定のユースケースに興味がある場合は、こちらのクラスを参照してTimeline ください。基本的に、私は非常に大きなタイムライン (月間で数百万のペア) を持っていますが、私の試合は最後の時間に触れるだけで済みます.

4

4 に答える 4

4

あなたが書く:

mongodb、またはその他の組み込み不可能なリソースはやり過ぎです

非常に小さなものも含めて、組み込み可能なデータベース エンジンがあることをご存知ですか? あなたが知っていれば、私はあなたの正確な要件について確信が持てず、なぜそれらを使用しないのですか.

Hibernate +埋め込み可能なDB (SQLite など) では不十分だと確信していますか? あるいは、BerkeleyDB Java Edition、HSQLDB、またはその他の組み込みデータベースがオプションになる可能性があります。

オブジェクト自体に対してクエリを実行しない場合 (実際には実行していないように思えます)、シリアル化は複雑なオブジェクトのオブジェクト リレーショナル マッピングよりも簡単かもしれませんが、私は試したことがなく、どちらがうまくいくかわかりません。速くなる。しかし、選択したフレームワークが[T <: Serializable]. [T: MySerializable]そうでない場合は、独自の「型クラス」を作成した後に書くことができますMySerializable[T](たとえばOrdering[T]、Scala 標準ライブラリのように)。

ただし、このタスクには標準の Java シリアライゼーションを使用したくありません。「シリアル化可能なもの」は、これにシリアル化を使用することを示唆しているため、悪い要件に聞こえますが、「選択したフレームワークでシリアル化可能なもの」に緩和できると思います。シリアル化は時間と空間の点で非常に非効率的であり、単一のオブジェクトをシリアル化するようには設計されていません。代わりに、特別なヘッダーを備えたファイルを返します。いくつかの異なるシリアライゼーション フレームワークを使用することをお勧めします。比較については、こちらをご覧ください。

カスタム実装の道に進まないその他の理由

さらに、ファイルを本質的に逆方向に読み取っているように聞こえます。これは、SSD 以外のディスクでは、パフォーマンスの点で非常に悪いアクセス パターンです。セクターを読み取った後、のセクターにアクセスするには、ほぼ完全なディスク ローテーションが必要です。 .

さらに、上記のコメントで Chris Shain が指摘したように、ページベースのソリューションを使用する必要があり、可変サイズのオブジェクトに対処する必要があります。

于 2012-02-03T23:38:21.460 に答える
2

組み込み可能な DB の 1 つにステップアップしたくない場合は、メモリ マップされたファイルのスタックはどうですか?

  • スタックは、目的のアクセス特性を満たしているようです。(一連のデータをプッシュし、最近プッシュされたデータを頻繁に繰り返します)
  • Java のMappedByteBufferを Scala から直接使用できます。実際にファイルをメモリにロードしようとせずに、メモリのようにファイルをアドレス指定できます。
  • マップされたファイルは仮想メモリのように機能するため、この方法で OS から無料でキャッシュを取得できます。最近書き込まれた/アクセスされたページは、OS がそれらをディスクにフラッシュする (または手動でフラッシュする) と判断するまで、OS のファイル キャッシュに残ります。
  • シーケンシャル読み取りのパフォーマンスが心配な場合は、ファイルの両端からスタックを構築できますが、通常、書き込んだばかりのデータを読み取っている場合は、まだメモリ内にあるため、問題になるとは思いません。(ただし、ページ全体で数時間/数日にわたって書き込んだデータを読んでいる場合は、問題になる可能性があります)
  • この方法でアドレス指定されたファイルは、64 ビット JVM でもサイズが 2GB に制限されますが、複数のファイルを使用してこの制限を克服できます。
于 2012-02-08T05:45:58.003 に答える
2

この Java ライブラリには、必要なもの含まれている場合があります。標準の Java コレクションよりも効率的にエントリをメモリに格納することを目的としています。

http://code.google.com/p/vanilla-java/wiki/HugeCollections

于 2012-02-01T14:54:17.550 に答える