2

我首先遇到了我的问题,试图为字典间隙列表发布程序创建一个非常大的(7k x 30k)的 int[][]。但唉,我试图分配数组的空间不足。我如何创建一个二维整数数组?

我想要的是一个列表列表,其中列表中的每个列表都是整数列表。这是我的代码示例。

代码:

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

这个列表列表将填充整数,表示特定文本中相同单词的两次出现之间的间隙。因此,在计数矩阵中,我保存一个字节,指示是否为指定索引指定了一个单词。然后在我现在创建的函数中,我正在遍历countMatrix,如果在那里找到一个字节,我将当前索引减去最后找到的索引,并将该数字保存在我的二维整数数组中,这给了我文本中每个相同单词之间的间隙。

那么我如何创建一个我需要完成的数据结构呢?

4

4 回答 4

1

我不知道这是否适合您,但如果您想坚持使用 Array,可以尝试使用稀疏矩阵作为选项。还有其他几个选项。Map, List,Weak reference Collections

于 2012-09-18T14:03:34.493 回答
1

要创建一个数组,您需要有足够的内存来创建它。

Anint每个值使用 4 字节,而数组至少使用 N * M 倍。

例如 4 * 30383 * 6782 大约是 820 MB,你需要有空闲来创建它。

这大约是 8 美元的内存,所以这应该是一个大问题,除非您没有这么多内存或者您将最大内存设置得太低。

我会至少将您的最大内存增加 1 GB,它应该可以工作。


替代方案包括

  • 使用较小的尺寸,例如charor shortor byte2-4 x 小。
  • 使用堆外内存,例如内存映射文件。这不会使用太多堆,但会使用通常更便宜的磁盘空间。
  • 增加您的最大内存大小。
于 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 回答