我使用三维数组作为我的Floyd-Warshall算法。但问题是,当我使用100以上的尺寸时,我的内存不足。
float[100][100][100] array= new float[100][100][100];
所以我在想备选方案。一种是使用二维 Float 并将它们存储在ArrayList中。但这根本不起作用,因为我遇到了Float初始化的麻烦,它是null而不是0,因此结果是假的。我不想再次更改我的代码,因为它也适合并行性。 那么有可能使用另一个数据结构来存储值吗?
答案 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;
}