Java 三维阵列的替代方案

Java 三维阵列的替代方案,java,android,arrays,arraylist,Java,Android,Arrays,Arraylist,我的Floyd-Warshall算法使用三维数组。但问题是,当我使用超过100的大小时,内存正在耗尽 float[100][100][100] array= new float[100][100][100]; 所以我在考虑其他选择。一种是使用二维Float并将其存储在ArrayList中。但这根本不起作用,因为我在初始化Float时遇到了麻烦,它是null而不是0,因此结果是false。我不想再次更改代码,因为它也非常适合并行性。 那么是否有可能使用另一种数据结构来存储这些值呢 大小为100的

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

float[100][100][100] array= new float[100][100][100];
所以我在考虑其他选择。一种是使用二维Float并将其存储在ArrayList中。但这根本不起作用,因为我在初始化Float时遇到了麻烦,它是null而不是0,因此结果是false。我不想再次更改代码,因为它也非常适合并行性。
那么是否有可能使用另一种数据结构来存储这些值呢

大小为100的3D多维数据集中的四字节浮点将至少占用4000000字节。这是相当大的一块

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

<>你可能想考虑把它们从内存中移走,只需要根据需要把它们带进来。

实现这一点的最佳方法取决于您需要对它们执行的处理类型。例如,如果使用以下伪代码执行直接顺序处理:

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个浮动)


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

大小为100的3D多维数据集中的四字节浮点将至少占用4000000字节。这是相当大的一块

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

<>你可能想考虑把它们从内存中移走,只需要根据需要把它们带进来。

实现这一点的最佳方法取决于您需要对它们执行的处理类型。例如,如果使用以下伪代码执行直接顺序处理:

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个浮动)


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

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


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

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


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

如果您需要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"

如果需要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"

您正试图从JVM中分配4字节*100*100*100~2MB的连续内存,这相当大。而是尝试创建具有三个浮动属性的对象。你可以用你想要的任何值初始化attibutes

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

您正试图从JVM中分配4字节*100*100*100~2MB的连续内存,这相当大。而是尝试创建具有三个浮动属性的对象。你可以用你想要的任何值初始化attibutes

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

如果你的内存不足,那么整个事情都需要修改。事实上,在Android设备上,这种资源是有限的(同样考虑到每个维度上有100个三维数组)。另一件事是使用一个动态数组(不完全是长度100,但是如果这是你需要的,你可能想考虑把计算移至设备之外)。你也可以粘贴到目前为止你所做的。你真的没有内存了吗?我已经填满了整个阵列,整个程序只需要19个MiB RAM。问题出在哪里?100只是一个例子,但有时我可能需要1000x1000x1000,这是不可能的。无论如何,我实际上在考虑使用这个ArrayList,因为如果我不再需要列表条目,我可以删除它们。这将减少内存,并可以帮助我运行我的算法。但正如我提到的,它不会与我的算法一起工作。问题是null、0以及其他不适合Float的内容。如果内存不足,那么整个内容都需要修改。事实上,在Android设备上,这种资源是有限的(同样考虑到每个维度上有100个三维数组)。另一件事是使用一个动态数组(不完全是长度100,但是如果这是你需要的,你可能想考虑把计算移至设备之外)。你也可以粘贴到目前为止你所做的。你真的没有内存了吗?我已经填满了你的整个阵列,整个程序只需要19米