gpt4 book ai didi

java - Java (Android) 中的大型二维数组存储

转载 作者:行者123 更新时间:2023-11-30 11:08:35 25 4
gpt4 key购买 nike

我正在用 Java 创建一个矩阵,它:

  • 在最坏的情况下最多可以包含 10,000 x 10,000 个元素
  • 可能会不时更改大小(假设按天数计算)
  • 存储 0-5 范围内的整数(大概是 byte )
  • 具有通过引用一对 Long 访问的元素ID(系统确定)
  • 是对称的(所以如果需要的话,可以在一半的空间内完成,尽管它会使诸如对行求和之类的事情变得更加困难(如果数组是无序的,则不可能))
  • 不一定需要排序(除非分成三角形,如上所述)
  • 需要在应用关闭后保持不变(目前正在写入文件)

我当前的实现是使用 HashMap<Pair<Long,Long>,Integer> ,这在我的小测试矩阵 (10x10) 上运行良好,但根据 this article ,当扩展到 10,000 x 10,000 个元素时,可能会遇到难以管理的内存使用。

我是 Java 和 Android 的新手,想知道:这种事情的最佳实践是什么?

我正在考虑切换回沼泽标准二维数组 byte[][]HashMap我的查找表 Long身份证。我会在矩阵访问方面受到显着的性能影响吗?另外,我认为没有任何一种方法就无法修改数组大小:

  1. 为假设的最坏情况预分配(这甚至可能不是最坏的情况,并且会占用不必要的内存量)
  2. 如果需要更改大小,则将数组复制到一个新数组中(暂时使我的内存使用量翻倍)

最佳答案

以为我会为后代回答这个问题。我接受了 Fildor 的建议,即使用带有两个查找列的 SQL 数据库来表示我的“矩阵”的行索引和列索引。该值存储在第三列中。

这种方法的主要好处是不需要将整个矩阵加载到 RAM 中来读取或更新元素,还有一个额外的好处是可以访问求和函数(以及 SQL 数据库中固有的任何其他功能) .由于内置 SQL 功能,这在 Android 上是一种特别简单的方法。

一个性能缺点是矩阵的初始化非常慢。但是,我采用的方法是假设如果在数据库中找不到某个条目,则它采用默认值。这消除了填充整个矩阵的需要(并且对稀疏矩阵特别有用),但缺点是在尝试访问无效索引时不会抛出错误。建议将此方法与一对列出有效行和列的列表结合使用,并在尝试访问数据库之前引用这些列表。如果您尝试使用内置 SQL 功能对行求和,如果您的默认值不为零,这也将无法正常工作,尽管这可以通过返回在求和的行/列中找到的条目数来解决,并将“缺失”元素乘以默认值。

关于java - Java (Android) 中的大型二维数组存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28494653/

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