1

Map に値のペア (単語と数値) を格納する必要があります。

メモリ使用量を最小限に抑える必要があるため、キーとしてTObjectIntHashMapTrove ライブラリから使用しようとしています。char[]しかし、このメソッドでは、メソッドを使用すると値を取得できませんget()
ハッシュコードの問題のため、マップに格納するためにプリミティブなchar配列を使用できないと思います。

私は使用しようとしましTCharArrayListたが、それも多くのメモリを必要とします。
私の目的に似た別のスタックオーバーフローの質問を読み、使用することを提案しTLongIntHashMap、文字列ワードのエンコード値を長いデータ型に保存します。この場合、私の単語には、ウィキペディアのコレクションに表示されるラテン文字やその他のさまざまな文字が含まれている可能性があります。長い文字列がエンコードに十分かどうかはわかりません。

Trie データ構造を使用して格納しようとしましたが、パフォーマンスも考慮して、メモリ使用量とパフォーマンスの両方に最適なものを選択する必要があります。

この問題について何かアイデアや提案はありますか?

4

2 に答える 2

3

データを格納する最もコンパクトな方法は、byte[]エンコードされた inUTF-8などを使用することです。これを独自のクラスでラップするか、byte[] をキーとして許可する独自の HashMap を作成できます。

メモリを節約するためにどれだけの時間を費やす価値があるかを再考します。PCまたはサーバーについて話している場合、最低賃金では、1時間の作業で1 GBを節約する必要があるため、100 MBのみを節約する場合は、テストを含めて約6分です.

于 2012-10-24T17:32:09.200 に答える
0

を実装する独自のクラスを作成し、およびCharSequenceの独自の実装を作成します。この実装では、大規模な共有ストレージも事前に割り当て、一度にその一部を使用します。(@Peter Lawrey の優れた提案をこれに組み込み、ストレージを使用することもできます。)equals()hashcode()char[]byte[]

LRU キャッシュを使用して「soft intern()」を実行する機会もあります。キャッシュがどこに行くのかを書き留めました。

これが私の言いたいことの簡単なデモンストレーションです。大量の同時書き込みが必要な場合は、以下のロック スキームを改善してみてください...

public final class CompactString implements CharSequence {
  private final char[] _data;
  private final int _offset;
  private final int _length;
  private final int _hashCode;

  private static final Object _lock = new Object();
  private static char[] _storage;
  private static int _nextIndex;

  private static final int LENGTH_THRESHOLD = 128;

  private CompactString(char[] data, int offset, int length, int hashCode) {
    _data = data; _offset = offset; _length = length; _hashCode = hashCode;
  }

  private static final CompactString EMPTY = new CompactString(new char[0], 0, 0, "".hashCode());

  private static allocateStorage() {
    synchronized (_lock) {
      _storage = new char[1024];
      _nextIndex = 0;
    }
  }

  private static CompactString storeInShared(String value) {
    synchronized (_lock) {
      if (_nextIndex + value.length() > _storage.length) {
        allocateStorage();
      }
      int start = _nextIndex; 
      // You would need to change this loop and length to do UTF encoding.
      for (int i = 0; i < value.length(); ++i) {
        _storage[_nextIndex++] = value.charAt(i);
      }
      return new CompactString(_storage, start, value.length(), value.hashCode());
    }
  }

  static {
    allocateStorage();
  }

  public static CompactString valueOf(String value) {
    // You can implement a soft .intern-like solution here.
    if (value == null) {
      return null;
    } else if (value.length() == 0) {
      return EMPTY;
    } else if (value.length() > LENGTH_THRESHOLD) {
      // You would need to change .toCharArray() and length to do UTF encoding.
      return new CompactString(value.toCharArray(), 0, value.length(), value.hashCode());
    } else {
      return storeInShared(value);
    }
  }

  // left to reader: implement equals etc.
}
于 2012-10-24T18:00:09.070 に答える