gpt4 book ai didi

java - 大量(浮点)值的最佳数据结构

转载 作者:行者123 更新时间:2023-12-01 14:59:43 27 4
gpt4 key购买 nike

我正在开发一个适用于 Android 的可视化应用程序(包括运行 Android 2.2 的旧设备)。

我的应用程序的输入模型包含一个区域,该区域通常由数万个顶点组成。典型模型有 50000-100000 个顶点(每个顶点都有一个 x,y,z float 坐标),即它们占用 600K-1200 KB 的总内存。该应用程序要求所有顶点在任何时候都在内存中可用。这就是我能分享的关于这个应用程序的全部内容(我不允许分享高级用例),所以我想知道我的以下结论是否正确以及是否有更好的解决方案。

例如,假设有 count=50000 个顶点。我看到两种解决方案:

1.) 我之前的解决方案是使用自己的 VertexObj (由于封装而具有更好的可读性,访问各个坐标时具有更好的局部性):

public static class VertexObj { 
public float x, y, z;
}

VertexObj mVertices = new VertexObj[count]; // 50,000 objects

2.) 我的另一个想法是使用一个大的 float[] 来代替:

float[] mVertices = new VertexObj[count * 3]; // 150,000 float values

第一个解决方案的问题是内存开销较大 - 我们使用的是移动设备,其中应用程序的堆可能限制为 16-24MB(并且我的应用程序也需要内存来处理其他事情)。据官方Android页,当不是真正必要时应避免对象分配。在这种情况下,即使对于 50,000 个顶点,内存开销也可能很大:

首先,“有用”内存为 50000*3*4 = 600K(这已被 float 值耗尽)。然后,由于 VertexObj 元素,我们有 +200K 的开销,并且由于 Java 对象头,可能还有 +400K 的开销(在 Android 上,每个对象也可能至少有 8 个字节)。对于 50,000 个顶点来说,这是 600K 的“浪费”内存,这是 100% 的开销 (!)。如果有 100,000 个顶点,则开销为 1.2MB。

第二个解决方案要好得多,因为它只需要 600K 的 float 值。

显然,结论是我应该使用float[],但我想知道这种情况下的风险。请注意,我的疑虑可能也与内存管理的较低级别(并非严格针对 Android 特定)方面有关。

据我所知,当我编写new float[300000]时,应用程序会请求VM保留300000*4 = 1200K字节的连续 block 。 (我在 Android 中遇到过这样的情况:我请求了 1MB byte[],但我收到了 OutOfMemoryException,尽管 Dalvik 堆的空闲空间远多于 1MB。我想这是因为它无法保留 1MB 的连续 block 。)

由于Android的VM的GC不是压缩GC,所以恐怕如果内存“fragment 化”,那么巨大的float[]分配可能会导致OOM。如果我就在这里,那么这个风险就应该得到处理。例如。分配更多 float[] 对象(每个对象会存储一部分,例如 200KB)怎么样?这种链表内存管理机制由操作系统和虚拟机使用,所以对我来说,我需要在这里使用它(在应用程序级别),这听起来很不寻常。我错过了什么?

如果什么都没有,那么我猜最好的解决方案是使用 float[] 对象的链接列表(以避免 OOM 但保持较小的开销)?

最佳答案

分配 float 时遇到的内存不足问题数组很奇怪。

如果堆中可用的最大内存块小于 float 组所需的内存,则堆会增加其大小以容纳所需的内存。

当然,如果堆已经达到应用程序可用的最大值,则此操作将会失败。这意味着您的应用程序已耗尽堆,然后释放大量对象,从而导致内存 fragment ,并且不再需要分配堆。但是,如果是这种情况,并且假设 fragment 内存足以容纳 float 组(否则您的应用程序将无法运行),那么这只是分配顺序的问题。

如果您在应用程序启动期间分配 float 组所需的内存,则您将拥有足够的内存。然后,您只需让应用程序执行剩余的操作,因为已经分配了无数的内存。

您可以使用DDMS轻松检查正在分配的内存块(以及空闲的内存块)在Eclipse ,选择您的应用程序,然后按 Update Heap按钮。

为了避免误导大家,我在post之前测试过,分配float[300000]的几个连续的内存块.

问候。

关于java - 大量(浮点)值的最佳数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13846463/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com