【问题标题】:Android: Storing large fixed arrays in android studioAndroid:在 android studio 中存储大型固定数组
【发布时间】:2017-03-30 18:05:50
【问题描述】:

我正在尝试使用二维数组在 android 中进行一些映射。基本上任务是将极坐标转换为笛卡尔坐标(两个坐标都必须是整数)。此转换用于在计算的 X 和 Y 坐标处选取一个值。

我有一个r 和需要返回xy 的输入。 (int)(R + rcostheta)(int)(R - rsintheta) 会给我所需的值(因为我的原始笛卡尔矩阵是 2R * 2R)。但是重复计算它们会导致大量开销。所以我决定预先计算这些值,这样我就可以避免计算。 (当我运行我的代码时,这些计算确实需要大约 2-3 秒的开销)

也就是说,我可以不使用Value[x][y],而是使用

Value [ X[r][theta] ] [ Y[r][theta] ]

但是这个转换矩阵/二维数组非常大。它有 128 x 960 个元素(我的应用程序有 128 个半径和 960 个段)。我不断收到“代码太大”错误。

您能建议一种简单的方法来实现这一点吗?即,将此映射矩阵存储在可以在没有太多开销的情况下引用的地方。

有些人建议使用数据库。但由于我是 android 编程新手,所以看起来有点吓人。当然可以简单得多?

目前我将两个映射矩阵存储为

int[][] X = new int[][]{
                 {229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356},

{next line},
.
.
.
{last line};

并将其用作

getBinary(tempBitmap, X[j][i],Y[j][i]);

如果 X 和 Y 矩阵更小,这应该可以工作。但由于它们很大,我不能这样做。请建议一种方法来执行此操作。

【问题讨论】:

  • 我也是这么想的。只到 1/4 部分。但是当我将大小减小到 1/4 时,我仍然得到代码太大的错误。我认为这个矩阵太大了,无法在这样的代码中使用
  • 是的,但即便如此,它仍然太大了。我不禁认为这是不好的编程习惯。在主代码中定义如此庞大的数组。

标签: java android performance optimization storage


【解决方案1】:

计算看起来应该不会花费很长时间 - 是因为您正在进行大量此类计算吗?

如果您的应用程序的典型运行只使用相对少量的点,但对它们进行了多次转换,那么最好在第一次需要时进行计算,并缓存结果 (在内存中,如果它们的数量不会很大的话)。

如果这不起作用,那么接下来要做的合乎逻辑的事情就是将值放入数据库中。这在 Android 应用程序中是很常见的事情,互联网上、书籍中等都有大量的教程可供使用。

【讨论】:

  • 个人应该不会花太多时间。但是我每次都必须扫描整个 128x960 点(不仅仅是你说的少量点。这么多点的 cos 和 sin 确实会导致开销。所以除非你缓存整个东西,否则缓存它们不是一种选择。是的,你是对的。我想我将不得不学习一些数据库。你能指出我在某个地方有关于这个的好的(和简单的)教程吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多