1

我正在用 Java 创建照片马赛克。它的输入是目标图像和一组图块。以下是我的算法:

a. Read all the tiles from the directory and process* it. [Every tile is of the same dimension.]
b. Read the target image, break it into cells [cells are of dimensions of a tile.]
c. Process* all the cells.
d. For each cell:
  d.1. Create a HashMap h [where key=euclidean metric, value=corresponding tile]
  d.2. For each tile:
    d.2.1 Calculate Euclidean metric.
    d.2.2 add it to h.
  d.3 Calculate min from h.
  d.4 Add the min to an outputList
e. Create the image from list of images in the outputList.

*process 方法接收图像并创建我们定义的类的对象ImageDetails。因此,对于处理的每个图块和单元格,都会ImageDetails创建一个对象,该对象存储其 RGB 值和尺寸等详细信息。有 2 个单独的对象列表:一个 for tiles,另一个 for cells

问题是平均大约有 300 个图块和多达 50,000 个单元格(也可能更多!)。因此,当我的程序运行时,除了它执行的计算和其他 ip/op 操作之外,它在内存中有这么多对象。

当我在资源较少(可用内存较少)的机器上运行此程序时,创建的输出图像会失真。但是当我在具有更多可用资源的机器上运行它时,它就完美了。我认为这是因为当没有可用资源时,它无法一次将所有对象保存在内存中。所以我看到一张图片放错了瓷砖。但是当它有足够的内存时,我会看到完美的输出图像。

我可以做些什么来确保无论可用内存如何,我都可以保留添加的元素的顺序,outputList以便我可以看到没有失真的图像。

谢谢。

编辑:

下面是同一个程序的输出的 2 个图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束的程序输出的差异。

在此处输入图像描述

在此处输入图像描述

4

2 回答 2

3

它可能与记忆没有任何直接关系——要么你有足够的,要么你没有。

您为 outputList 使用什么集合类?ArrayList 和 LinkedList 都应该保证元素的顺序。

于 2012-10-27T01:47:05.557 回答
1

下面是同一个程序的输出的 2 个图像。唯一的区别是它们在不同的机器上运行。请帮助我理解给定算法和约束的程序编译的差异。

编译没有区别。

内存大小应该没有区别。或者至少,它不应该导致这种问题。

我怀疑您所看到的实际上是由于多线程应用程序中的不正确同步造成的。但是,如果没有看到您的代码,我们不太可能提供帮助。(而且我怀疑您的应用程序太大而无法在 SO 问题中发布。)

(另一种理论上的可能性是您的应用程序正在“挤压”OutOfMemoryError异常。但我无法想象有人会做那么愚蠢的事情......)


我已经用示例更新了我的问题。

它们不相关。请注意答案的内容。问题极不可能出在 JVM 或 Java 运行时库中。问题很可能出在您的代码中。如果不查看实际代码,我们无法更具体。

于 2012-11-02T00:55:05.943 回答