gpt4 book ai didi

Java堆硬盘

转载 作者:搜寻专家 更新时间:2023-10-31 20:29:31 25 4
gpt4 key购买 nike

我一直致力于生成分形轨道的 Java 程序已有一段时间了。就像照片一样,图像越大,缩小时效果越好。该程序使用二维对象(点)数组,在计算点值时写入该数组。也就是说Point是存储在它对应的值中的,即:

Point p = new Point(25,30);
histogram[25][30] = p;

当然,这是为简单起见而编辑的。我可以将点值写入 CSV,稍后将它们应用于栅格,但使用类似的方法会产生不良结果。我尝试了很长一段时间,因为我很高兴能够通过没有这个阵列释放的空间来制作更大的图像。它只是行不通。为清楚起见,我想补充一点,Point 对象还存储颜色数据。

下一个问题是 WriteableRaster,它将具有与数组相同的维度。两者结合占用大量内存。我已经开始接受这一点,在多次尝试改变它的完成方式之后,每次都获得较低质量的结果。

在尝试针对内存和时间进行优化后,我得出的结论是我确实受到 RAM 的限制。这就是我想改变的。我知道 -Xmx 开关(设置为 10GB)。有什么方法可以使用 Windows 的虚拟内存来存储栅格和/或数组?我很清楚这会导致显着的性能下降,但除了降低质量之外,似乎真的没有太多选择。

最佳答案

操作系统已经为您和每个进程将硬盘驱动器空间转换为 RAM —— 不需要任何魔法。这将是一场比您想象的更严重的性能灾难;它会太慢以至于无法有效工作。

您在寻找内存映射文件吗? http://docs.oracle.com/javase/6/docs/api/java/nio/MappedByteBuffer.html

如果这真的要在内存中完成,我敢打赌您可以通过一些优化来显着降低内存使用量。例如,您的 Point 对象主要是开销而不是数据。计算引用所需的字节数,然后计算 Object 开销,与两个 int 进行比较。

使用两个大的并行 int 数组作为 x 和 y 坐标,您可以将开销减少到零。当然,您必须封装它以便在您的代码中进行访问。但它可以将此数据结构的内存使用量减半。减少数百万个对象也加快了 GC 运行。

与其将 WritableRaster 放入内存,不如考虑自己直接以某种简单的图像格式写出图像文件。 BMP 可以很简单。然后也许使用外部工具来有效地转换它。

尝试 -XX:+UseCompressedOops 来减少对象开销。还可以尝试 -XX:NewRatio=20 或更高版本,让 JVM 为长期存在的对象保留几乎所有的堆。这实际上可以让您使用更多堆。

关于Java堆硬盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13834686/

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