【问题标题】:Lower memory consumption with byte arrays使用字节数组降低内存消耗
【发布时间】:2015-09-14 07:45:03
【问题描述】:

我的应用程序中有很多字节数组,它们通常连续包含相同的值。我一直需要访问这个数组,所以压缩可能会导致性能问题。我的程序消耗 1.5GB 内存(任务管理器),其中 1GB 只是字节数组。

有没有办法更好地处理这类数据?

为了弄清楚我在说什么:我正在开发一个体素引擎,这些字节数组代表体素的类型(因此“空气”体素可以经常连续包含)。

我需要尽可能多地节省内存。

【问题讨论】:

  • 所以你知道哪个字节数组是不需要的?
  • 好吧,那些只包含空气的人无论如何都没有得救。但是其他的则充满了噪声生成的值。
  • @user3088126 是否可以重新生成噪声生成的值或避免生成它们,除非数据实际上对用户可见。您需要记录的唯一方块是用户看到的方块。
  • 如果您在运行服务器,几 GB 并不多,但如果您在 PC 上运行,这可能很重要,您是否考虑使用内存映射文件。这些具有使用非常少的堆并在您更新它们时被保存的优点。如果文件的页面有一段时间没有被使用,操作系统可以将它们从内存中取出,并在您再次使用它们时将它们重新添加。
  • 我需要保存数据(生成将需要更长的时间......这不仅仅是稍后的噪音)并且我需要数据来生成渲染数据。内存映射文件到底是什么?它们在 Java 中可用吗?

标签: java arrays


【解决方案1】:

这听起来像是flyweight pattern 的一个用例:创建一种代理类而不是直接访问数组。这些代理将访问一个公共商店。每次添加新数组时,代理都会查看存储是否已经存在相等字节数组并引用它。这消除了重复。

当然,这种模式要求数组是不可变的。如果你需要修改它们,你首先需要复制数组,然后修改它,然后再次“去重”。

【讨论】:

  • 数组可以随时更改,也可以删除,也可以随时添加新数组……这就是问题所在……但我想我现在有了一个想法……跨度>
  • 有多种方法可以实现享元模式:您不一定需要使用代理对象(尽管在您的情况下,它可能有助于将所有操作集中在一个地方)。您也可以直接与这样的商店合作。喜欢:workingArray = store.deduplicate(workingArray);。第一次,你会得到相同的数组。第二次,你会再次得到第一个数组。
  • 我现在只通过重用真正总是出现的数组来解决它,因为尝试缓存噪声值不会有太大帮助。我现在正在测试性能.... 编辑:我现在至少节省了 300MB 堆空间。感谢您的提示:)
  • 算了...至少 500MB o.o 这非常好用...但是以后它可能只比那个值少,但还是可以的 :) 非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-09-10
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2019-02-18
  • 1970-01-01
相关资源
最近更新 更多