0

我的 Floyd-Warshall 算法使用了三维数组。但问题是当我使用超过 100 的大小时,我的内存不足。

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

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

4

4 回答 4

3

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

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

您可能需要考虑将它们移出内存并仅在需要时将它们带入。

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

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 个浮点数)。

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

于 2013-09-11T07:34:48.900 回答
3

数组是对象,因此您不仅限于使用包装器类型。您可以制作一个数组列表float[][]

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

于 2013-09-11T07:35:10.070 回答
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"

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

于 2013-09-11T07:35:20.307 回答
-1

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

class Node{
private float u =0;
private float v =0;
private float l =0;
}
于 2013-09-11T07:39:06.673 回答