【问题标题】:What is the best way to store multiple points (float, float)?存储多个点(浮点数,浮点数)的最佳方法是什么?
【发布时间】:2021-08-05 05:15:16
【问题描述】:

我是 Java 新手,我需要存储大量点(x、y 浮点坐标)。哪个选项更适合存储在大数组中(使用更少的内存)?

点类:

// It`s in the same file as my main class

class Point {
    public float x;
    public float y;
    
    public Point(float x, float y){
        this.x = x;
        this.y = y;
    }
}

或数组数组:

float[] point = { 0.0f, 0.0f };
float[][] positions = { //Multiple Pointes here\\ };

【问题讨论】:

  • 你认为有多少元素“大”?

标签: java arrays memory-management points


【解决方案1】:

就内存而言,最便宜的可能是使用大小为 2N 的一维数组(一旦 Java 获取值对象,这可能会改变),其中 N 是点数,其中 x 存储在 2n 处,y 存储在2n+1 (0

换句话说:

public class Points {

  private final float[] points;

  public Points(int size) {
    points = new float[2 * size];
  }

  public float getX(int index) {
    return points[2 * index];
  }

  public void setX(int index, float value) {
    points[2 * index] = value;
  }

  public float getY(int index) {
    return points[2 * index + 1];
  }

  public void setY(int index, float value) {
    points[2 * index + 1] = value;
  }
}

但是,如果您需要单独处理点,那么使用 Point 类会更好。与使用二维数组(IIRC,Point 每点 16 个字节,float[2] 每点 24 个字节)相比,它的开销要少一些,但也提供了更好的抽象。

【讨论】:

  • @Andreas 一个数组的开销是 12 个字节。一个 2N 浮点数的数组是 12 + 2N * 4 + 4 个字节(最后 4 个是填充以实现 8 个字节的倍数)。如果我们有一个 Point 对象数组,大小为 12 + N * ((8 + 2 * 4) + 4 + 4) + 4 字节(或 16 + N * 24 字节)。如果我们使用浮点数的二维数组,大小为 12 + N * ((12 + 2 * 4 + 4) + 4 + 4) + 4 字节(或 16 + N * 32 字节);那些 '+ 4 + 4' 是 4 个字节的对象/数组引用和 4 个字节的填充(或 8 个字节的对象/数组引用,没有压缩的 OOPS)。
  • 我不应该在计算中为每个对象引用包含 4 个字节的填充,但我认为其余的仍然成立。
  • However, if you need to handle points individually 单独处理点是什么意思?
  • 这看起来是一个很好的解决方案,我需要在 for 循环中读取指针,这样我就可以跳转 2 并明白这一点,我想我会使用它。谢谢
  • @user15329314 使用Point(或float[][])之类的优点是您可以传递各个点(Point 或float[2])。使用不再可能的单个一维数组解决方案(或者您需要暂时将 (x, y) 放入 Point 或 float[2] 以将其传递到其他地方,但这存在可变性问题,当然还有一些问题额外开销)。当然,Point 的优势在于它可以在数据旁边定义其他操作。
【解决方案2】:

一个对象有一个开销。如果您唯一关心的是内存消耗,那么原始floats 的二维数组会“更便宜”。

【讨论】:

  • 我不同意。数组也是一个对象,它需要存储数组长度的开销,所以它使用更多的内存。额外类的开销是一次性的,因为类定义是第一次加载的。之后没有额外的开销,而数组在每个使用的实例上都有存储开销。
  • 是的,回复@Mureinik。甚至像 GeoJSON (en.wikipedia.org/wiki/GeoJSON) 这样的地理空间数据库也使用多维浮点数组来表示坐标。
  • @Lovababu 您的评论是题外话(无关紧要),因为您在谈论如何将信息序列化为 JSON,但这个问题是关于如何最好地将数据存储在 Java 数据结构中。
  • @Andreas 我的目的是展示框架/库如何存储地理空间数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多