【发布时间】:2015-01-22 07:09:14
【问题描述】:
我正在从事一个涉及启发式的项目,并且我用 Java 构建了它(应该用 C 语言构建它)。 我遇到了内存问题。
我的树由对象节点组成,每个对象包含一个数组、一个矩阵和三个整数。 我已经削减了许多其他值,以尝试节省更多的内存空间,但是仍然不够。
所以,我在想我也可以削减矩阵,并将其转换为数组。 但是,我的整个项目都是建立在坐标上的,以达到矩阵中的某个点。 因此,在进行任何更改之前,我想知道这会影响内存使用多少(或不影响多少)。
编辑:数组和矩阵都由 int 基元组成。
数组是array[25],矩阵是matrix[5][5]。
矩阵代表游戏的棋盘,包含字段是否为空,或者里面是否有某种类型的棋子的信息(全是int)。
我说的是 16GB 的 RAM 使用量和 2500 万个节点。
我做了这个方法,用来克隆数组:
public int[] cloneArray(int[] array){
int i = 0;
int[] clone = new int[array.length];
while (i < array.length){
clone[i] = array[i];
i++;
}
return clone;
}
我们使用了类似的方法来克隆矩阵和对象本身。
编辑: 在发现探查器的存在后,我进行了检查。 这是结果的屏幕截图:
我认为这些数字是有道理的,因为在控制台中,您可以看到几乎与在分析器中看到的一样多的节点,状态(在控制台中,“estados”是状态的指针目前正在扩展中)。
因此,在分析器中,我们可以看到将近 20m 个状态,它们是生成的节点。 每个状态包含 1 个数组和 1 个矩阵。
我们可以看到 138m 的数组,除以 6 等于 23m。 并且由于一个矩阵是5x5的,那么5x23m的数组包含在矩阵中,另外23m是数组。
我说得有道理吗?这种解释准确吗?
这是一个 Dropbox 链接,您可以查看完整分辨率的图片: https://www.dropbox.com/s/7wxz8vch1wnrsyr/Untitled.png?dl=0
【问题讨论】:
-
“矩阵”是二维数组还是自定义对象?
-
一个数组会阻塞所有分配给它的内存,所以当你创建一个二维数组时,整个空间都会被占用——如果你有一个稀疏的数组,这会阻塞更多的内存,是的.
-
“应该是用 C 语言实现的” - 如果你还用
c标记了你的问题,同时说这个你的问题可能已经收到了几个赞成票:) -
如果你有这么多节点,我猜使用一维数组而不是二维数组可能会有所不同,因为正确获取索引很容易出错。另一方面,如果您的 RAM 如此紧张,您可能很容易再次遇到麻烦
-
@WilhelmSorban en.wikipedia.org/wiki/Sparse_matrix 是的,与一维数组相比,二维数组具有额外的开销,因为二维数组实际上是一个数组数组,因此对于您拥有的每一行常见的“数组开销”。