、あなたのプログラムがdictsの値データのため、少なくとも300 * 300 * 300 * 4 * 3バイトのみ必要(!) 。また、キータプルは300 * 300 * 300 * 3 * 3 * 4バイトを占めます。
合計1296000000バイト、つまり1.2 GiBのデータです。
この計算には、dict内のデータを維持するオーバーヘッドは含まれません。
したがって、マシンに障害が発生した場合のメモリ量によって異なります。
あなたは最初のステップを行うと、以前のように半分しかメモリを占有します(理論的に)どの
s = {}
ns = {}
ts = {}
for i in range(0, 300):
for j in range(0, 300):
for k in range(0, 300):
index=(i, j, k)
s[index]=j
ns[index]=k
ts[index]=i*j*k
を行うことができます - だけでなく、データのみのために、インデックスタプルが再利用されます。
あなたの説明(単なるカウントしたいもの)から、事前に初期化するための完全な範囲の組み合わせは必要ありません。したがって、質問に示されている初期化を省略し、実際にデータがある場所にのみこれらの値を格納するストレージを構築することができます。
defaultdict()
を使用するか、手動でその動作を模倣することができます。ほとんどの組み合わせがカラー「パレット」で使用されていないと思われます。
from collections import defaultdict
make0 = lambda: 0
s = defaultdict(make0)
ns = defaultdict(make0)
# what is ts? do you need it?
ここでは、必要に応じて書き込み可能な3つのdict
オブジェクトがあります。次に、あなたが実際に持っている色の組み合わせごとに、s[index] += 1
respを実行することができます。 ns[index] += 1
。
私はあなたのts
についてよくわかりません - あなたはそれを計算することができますか、別の解決策を見つける必要があります。
1)約3 * 300^3のオブジェクトを作成しています。 2)あなたの意図は不明です。なぜあなたはこれをしたいのですか? 3)あなたはあなたの記憶限界を知らせません。チェックしないとコードが* 4GBを超えます(それより高くなると感じます)が、それ以外ではそれ以外のものは派生できません。 – Makoto
さて、それはたくさんのメモリを割り当てようとしています。そのためです。おそらく、達成しようとしていることを教えて、質問を更新するべきでしょう。誰かがあなたの問題を解決するために別の方法を考え出すかもしれません。 –
私はピクセルの赤、青、緑の成分のfrequnecyを保存しようとしています。 –