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 つの個別のリストがあります。1 つは 用tiles、もう 1 つは 用cellsです。

問題は、平均して約 300 個のタイルと 50,000 個ものセルがあることです (それ以上になることもあります)。したがって、プログラムの実行中は、実行する計算やその他の ip/op 操作に加えて、これらの多くのオブジェクトがメモリ内に保持されます。

リソースが少ない (使用可能なメモリが少ない) マシンでこのプログラムを実行すると、作成される出力イメージが歪んでしまいます。しかし、より多くの利用可能なリソースを備えたマシンで実行すると、完璧です。利用可能なリソースがない場合、一度にすべてのオブジェクトをメモリに保持できないためだと思います。そのため、タイルの配置が間違っている画像が表示されます。しかし、十分なメモリがあれば、完璧な出力画像が表示されます。

使用可能なメモリに関係なく、追加された要素の順序を保持して、outputList歪みのない画像を表示できるようにするにはどうすればよいですか。

ありがとう。

編集:

以下は、同じプログラムの出力である 2 つの画像です。唯一の違いは、それらが異なるマシンで実行されることです。アルゴリズムと制約が与えられた場合のプログラムの出力の違いを理解するのを手伝ってください。

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

3

おそらく、メモリとは直接関係ありません-十分にあるか、ないかのどちらかです。

outputList に使用しているコレクション クラスは何ですか? ArrayList と LinkedList はどちらも要素の順序を保証する必要があります。

于 2012-10-27T01:47:05.557 に答える
1

以下は、同じプログラムの出力である 2 つの画像です。唯一の違いは、それらが異なるマシンで実行されることです。アルゴリズムと制約が与えられたプログラムのコンパイルの違いを理解するのを手伝ってください。

コンパイルしても違いはありません。

メモリサイズに違いはありません。または、少なくとも、この種の問題を引き起こすべきではありません。

あなたが見ているのは、実際にはマルチスレッド アプリケーションでの不適切な同期が原因であると思われます。ただし、あなたのコードを見なければ、私たちが助けることができる可能性は低いです. (そして、SO の質問に投稿するには、アプリケーションが大きすぎるのではないかと思います。)

(もう1つの理論的な可能性は、アプリケーションが例外を「押しつぶしている」というOutOfMemoryErrorことです。しかし、誰もそのような愚かなことをしているとは想像できません...)


質問を例で更新しました。

それらは関係ありません。Answers の内容に注意してください。問題が JVM または Java ランタイム ライブラリにある可能性はほとんどありません。問題がコードにある可能性が非常に高いです。実際のコードを見ないと、これ以上具体的なことは言えません。

于 2012-11-02T00:55:05.943 に答える