Tag: 内存高效

Javaarrays效率

我对行动机制并不是100%肯定所以我决定在此发布以进一步澄清。 我正在做一个应该用Java处理大量数据的项目(它必须是Java)。 我希望它尽可能高效。 有效率我的意思是内存和速度计算应首先出现,可读性应该排在第二位。 现在我有两种方法来存储我的数据:创建一个MyObject数组 1) MyObject[][] V = new MyObject[m][n] 或者创建两个int数组: 2) int[][] V = new int[m][n] 3) int[][] P = new int[m][n] 显然, MyObject包含至少两个字段和一些方法。 现在我注意到,在循环遍历MyObject数组以分配值时,我必须调用new ,否则我会得到一个空指针exception。 这意味着第1行中的new是不够的。 考虑到数组也是Java中的对象,为了论证,这是一个比P[i][j]=n更昂贵的操作吗?

2D游戏中碰撞的高效算法?

我正在按照教程编写一个用Java编写的炸弹人 (这是我的第一个游戏)。 本教程建议使用以下代码来检测冲突。 for (int p=0; p<entities.size(); p++) { for (int s=p+1; s<entities.size(); s++) { Entity me = (Entity) entities.get(p); Entity him = (Entity) entities.get(s); if (me.collidesWith(him)) { me.collidedWith(him); him.collidedWith(me); } } 到目前为止, 实体是一个包含敌人和玩家的数组列表。 由于我还想检测玩家与墙壁发生碰撞,我是否应该将每个墙壁或砖块放入实体arraylist中? 如果是这样,这个算法效率不高吗? 这些瓷砖不会与其他瓷砖碰撞,所以我想在不同的列表中管理游戏实体。 你有什么建议? 有没有更有效的算法呢? 注意:我已经阅读了与2D游戏中的碰撞有关的其他问题。 非常感谢。

如何在Java中有效地存储小字节数组?

小字节数组是指字节数组,长度从10到30。 通过商店我的意思是将它们存储在RAM中 ,而不是序列化并持久保存到文件系统。 系统macOS 10.12.6,Oracle jdk1.8.0_141 64位,JVM args -Xmx1g 示例: new byte[200 * 1024 * 1024]预期行为是堆空间的≈200mb public static final int TARGET_SIZE = 200 * 1024 * 1024; public static void main(String[] args) throws InterruptedException { byte[] arr = new byte[TARGET_SIZE]; System.gc(); System.out.println(“Array size: ” + arr.length); System.out.println(“HeapSize: ” + Runtime.getRuntime().totalMemory()); Thread.sleep(60000); } 但是对于较小的数组,数学并不那么简单 public static […]

内存有效的多值映射

嗨,我有以下问题:我在MultiValueMap存储字符串和相应的整数值列表MultiValueMap我存储大约13000亿字符串,一个字符串最多可以有500或更多值。 对于每个值,我将在地图上随机访问。 所以最糟糕的情况是13 000 000 * 500点拨电话。 现在地图的速度很快但内存开销却很高。 MultiValueMap就是HashMap/TreeMap<String, <ArrayList> 。 HashMap和TreeMap都有很多内存开销。 一旦完成,我就不会修改地图,但我需要它在程序中随机访问的速度要快且尽可能小。 (我将它存储在磁盘上并在启动时加载它,序列化的映射文件占用大约600mb但在内存中大约需要3gb?) 最有效的内存是将String存储在已排序的字符串数组中,并为值提供相应的二维int数组。 因此访问将是字符串数组上的二进制搜索并获取相应的值。 现在我有三种方法可以实现目标: 我使用一个排序的MultivalueMap(TreeMap)来创建所有的东西。在我完成获取所有值之后,我通过调用map.keyset().toArray(new String[0]);获取字符串数组map.keyset().toArray(new String[0]); 创建一个二维int数组并从多值映射中获取所有值。 Pro:它易于实现,在创建过程中仍然很快。 Con:从Map到Arrays的复制过程中占用的内存更多。 我从一开始就使用Arrays或者ArrayLists,并将所有内容存储在Pro:最少的内存开销。 Con:这将非常慢,因为每次添加一个新Key时我都必须对Array进行排序/复制。另外,我需要实现自己的(可能更慢)排序,以保持相应的int数组的顺序相同字符串。 难以实施 我使用Arrays和MultivalueMap作为缓冲区。 程序完成创建阶段的10%或20%后,我会将值添加到数组并保持顺序,然后启动一个新的Map。 Pro:足够的速度和足够的内存效率。 骗局:难以实施。 这些解决方案都不适合我。 您是否知道此问题的任何其他解决方案,可能是内存高效(MultiValue)Map实现? 我知道我可以使用数据库,所以不要把它作为答案发布。 我想知道如何在不使用数据库的情况下做到这一点。