1

画像をハッシュ値のリストに変換する次の関数があります(PILを使用):

def _GetImageHash(image):
  st = time.time()
  image_list = list(image.getdata())
  (columns, rows) = image.size
  hash_vals = [0]*rows
  for i in xrange(0,rows):
    hash_vals[i] = hash(tuple(image_list[i*columns:(i+1)*columns]))
  print "_GetImageHash time taken: ", time.time() - st
  return hash_vals, image_list

別の関数で、このメソッドを多数の画像ファイルに対して呼び出し、結果のリストを保存します。ただし、この関数がハッシュ値を計算するのにかかる時間は、呼び出しごとに大幅に増加することがわかりました。呼び出しの順序を変更しても、この観察された動作は変わりません (すべての画像は同じサイズであるため、この関数がハッシュ値を計算するのにかかる時間に大きな違いはありません)。実際、私がそうするなら:

image1_hash, image1_list = _GetImageHash(image1)
image2_hash, image2_list = _GetImageHash(image1)
image3_hash, image3_list = _GetImageHash(image1)
image4_hash, image4_list = _GetImageHash(image1)
image5_hash, image5_list = _GetImageHash(image1) ...

報告された時間は次のとおりです。

_GetImageHash time taken:  0.672996044159
_GetImageHash time taken:  1.40435290337
_GetImageHash time taken:  2.10946083069
_GetImageHash time taken:  2.84965205193
_GetImageHash time taken:  3.57753205299
_GetImageHash time taken:  4.71754598618
_GetImageHash time taken:  5.10348200798
_GetImageHash time taken:  5.83603620529
_GetImageHash time taken:  6.57408809662
_GetImageHash time taken:  7.30649399757
_GetImageHash time taken:  7.26073002815
_GetImageHash time taken:  7.94218182564

リストを保存しているため、これが発生しているようです。しかし、ここでメモリ使用量が原因でパフォーマンスが低下するのはなぜですか? メモリ使用量が時間のパフォーマンスに大きな影響を与えないように、これに対処するために何かできることはありますか?

4

2 に答える 2

1

ガベージコレクタを無効にしてみてください。

import gc
gc.disable()

#your code

gc.enable()
于 2012-12-11T10:05:49.233 に答える
0

画像の大きさはわかりませんが、メモリの問題だと思われる場合は、プロセスが使用しているメモリの量を確認することから始めます。オンラインでレシピを見つけてプロセスを呼び出すか (ここなど)、OS のプロセス モニターでメモリ使用量を追跡することができます。

メモリ使用量の場合、最初に行うことは、リスト バージョンの image_list をよりコンパクトなものに置き換えることです。Numpy 配列が理想的ですが、標準ライブラリ モジュールの配列も役立つはずです。

image_list の値がすべて小さい整数 (約 256 未満) である場合、Python はより小さくコンパクトなストレージを使用しており、それらの整数を再割り当てしていないためです。ただし、リスト内のポインターを保持するために再割り当てしています。配列に 4 (8) バイトの値を保持させると、それは 32 (64) ビット システムのリストで使用されるポインター サイズと同じになります。私は PIL を使用したことがないので、pil.Image.getdata が返されることに慣れていません。

于 2012-11-27T10:37:55.690 に答える