2

ディクショナリ ギャップ リストの投稿プログラム用に、非常に大きなサイズ (7k x 30k) の int[][] を作成しようとして、最初に問題に遭遇しました。しかし、残念ながら、配列を割り当てようとしてスペースが不足しています。整数の 2 次元配列を作成するにはどうすればよいですか?

私が欲しいのは、リスト内の各リストが整数のリストであるリストのリストです。これが私のコードのサンプルです。

コード:

 static final int numberOfTerms = 6782;
 static final int numberOfLines = 30383;
 byte[][] countMatrix = new byte[numberOfLines][numberOfTerms];
 int[][] gapsMatrix = new int[numberOfLines][numberOfTerms]; // To big!!

このリストのリストは、特定のテキストで同じ単語が 2 回出現する間のギャップを表す整数で埋められます。そのため、カウント行列には、指定されたインデックスに対して単語が指定されているかどうかを示すバイトが保持されます。次に、現在作成している関数で countMatrix を調べ、そこにバイトが見つかった場合は、現在のインデックスから最後に見つかったインデックスを差し引いて、その数値を整数の 2D 配列に保存します。テキスト内の同じ単語間のギャップ。

では、これを達成するために必要なデータ構造をどのように作成すればよいでしょうか?

4

4 に答える 4

1

これがうまくいくかどうかはわかりませんが、配列に固執したい場合は、オプションとして疎行列を試すことができます。他にもいくつかのオプションがあります。MapListWeak reference Collectionsなど

于 2012-09-18T14:03:34.493 に答える
1

配列を作成するには、それを作成するのに十分なメモリが必要です。

Anintは値ごとに 4 バイトを使用し、配列は少なくとも N * M 倍を使用します。

たとえば、4 * 30383 * 6782 は約 820 MB で、これを作成するには空き容量が必要です。

これは約 8 ドル相当のメモリなので、これだけのメモリがないか、最大メモリを低く設定しすぎない限り、これは大きな問題になるはずです。

最大メモリを少なくとも 1 GB 増やすと、うまくいくはずです。


代替案には以下が含まれます

  • より小さなサイズを使用しcharshortくださいbyte
  • メモリ マップド ファイルなどのオフ ヒープ メモリを使用します。これは多くのヒープを使用しませんが、通常は安価なディスク容量を使用します。
  • 最大メモリサイズを増やしてください。
于 2012-09-18T14:05:15.880 に答える
0

あなたは単にそれをするのに十分なメモリを持っていません。

http://www.javamex.com/tutorials/memory/array_memory_usage.shtml

申し訳ありませんが、明確にしませんでしたが、別のDSを使用してもこれが変わる可能性は低いです。

于 2012-09-18T13:59:04.027 に答える
0

では、これを達成するために必要なデータ構造をどのように作成すればよいでしょうか?

が正しく理解されている場合、同じ用語間のギャップを記録する必要があります。たとえば、分析する必要がある一連の用語があるとします。

    String[] terms = ...;
    Map<String, List<Integer>> map = new TreeMap<String, <Integer>>();
    for (int i = 0; i < terms.length; i++) {
      String term = terms[i];
      List<Integer> positions = map.get(term);
      if (gaps == null) {
        positions = new ArrayList<Integer>();
      }
      positions.add(i);
      map.set(term, positions);
    }

後で、各用語の位置を見て、それらの間のギャップを計算することができます。(そのギャップ計算をこのコードに統合することもできますが、演習として残しておきます)。

于 2012-09-18T14:41:51.673 に答える