替代三维数组

时间:2013-09-11 07:29:10

标签: java android arrays arraylist

我使用三维数组作为我的Floyd-Warshall算法。但问题是,当我使用100以上的尺寸时,我的内存不足。

float[100][100][100] array= new float[100][100][100];

所以我在想备选方案。一种是使用二维 Float 并将它们存储在ArrayList中。但这根本不起作用,因为我遇到了Float初始化的麻烦,它是null而不是0,因此结果是假的。我不想再次更改我的代码,因为它也适合并行性。 那么有可能使用另一个数据结构来存储值吗?

4 个答案:

答案 0 :(得分:3)

大小为100的3D立方体中的四字节浮点数至少占用4,000,000字节。这是一个相当大的一块。

如果您同时将它们全部存储在内存中,那么无论您使用何种数据结构,它们都会占用至少那么多空间。

您可能需要考虑将它们 out 移到内存中,并根据需要将它们带入。

最好的方法取决于您需要对它们进行哪种处理。例如,如果您正在进行直接顺序处理,例如使用以下伪代码:

for i = 0 to 99:
    for j = 0 to 99:
        for k = 0 to 99:
            loadAndDoSomethingWith (i, j, k)
flushData()

currentlyLoaded = -1
float buffer[100]

def loadAndDoSomethingWith (i, j, k):
    if i * 100 + j != currentlyLoaded:
        flushData()
        currentlyLoaded = i * 100 + j
        read buffer from file #currentlyLoaded
    doSomethingWith (buffer, k)

def flushData():
    if currentlyLoaded != -1:
        write buffer to file #currentlyLoaded

然后你可以一次引入一个维度(100个浮点数)。

您可以使用多个缓冲区执行类似的方案,以了解更复杂的情况,例如,如果您需要来自数据结构中更多位置的数据。您应该尝试将缓冲策略与算法相匹配,以避免尽可能多的颠簸。

答案 1 :(得分:3)

数组是对象,因此您不限于使用包装类型。您可以创建float[][]的数组列表。

无论如何,100x100x100 = 1000 000个浮点数应该占用大约4 MB的内存。这不是什么,但似乎没有不合理的大量记忆。你确定问题不在其他地方吗?您是否有可能坚持不再需要的物品并且可能被垃圾收集?

答案 2 :(得分:0)

恕我直言,如果您需要100x100x100浮点数,那么您无能为力。浮动对象需要比原始浮点数更多的内存,因此使用它们来减少内存消耗是没有意义的。你只能做两件事:
1.更改/优化您的算法,以便使用更少的数字 2.在AndroidManifest中使用:

<application
    android:name="com.myApp"
    android:allowBackup="true"
    android:icon="@drawable/app_icon"
    android:label="@string/app_name"
   android:largeHeap="true"

这样你就可以增加你使用的堆的大小。
只是我的两个便士。

答案 3 :(得分:-1)

您正在尝试从JVM分配4byte * 100 * 100 * 100~2MB的连续内存,这是非常巨大的。而是尝试使用三个浮点属性创建对象。您可以使用您想要的任何值来初始化属性。

class Node{
private float u =0;
private float v =0;
private float l =0;
}