2017-10-27 14 views
0

私はforループのデモンストレーションを書いて、RGBスペクトル内のすべての可能な色を出力します。意図は、どのようにしてforループが動作するかを理解するのに役立ちます。なぜトリプルにメモリ例外がスローされるのですか?

import csv 

print("Started") 

for_max = 256 


with open('spectrum.csv', 'w', newline='') as csvfile: 
    writer = csv.writer(csvfile) 
    spectrum = [] 
    head = ["R", "G", "B", "Hex"] 
    spectrum.append(head) 
    for r in range(0, for_max): 
     for g in range(0, for_max): 
      for b in range(0, for_max): 
       r_hex = format(r, '02x') 
       g_hex = format(g, '02x') 
       b_hex = format(b, '02x') 
       hex_string = str("#") + str(r_hex) + str(g_hex) + str(b_hex) 
       spectrum.append([format(r, '03'), format(g, '03'), format(b, '03'), hex_string]) 
    writer.writerows(spectrum) 
print("Finished") 

残念ながら、現在メモリオーバーフローが発生しています。

トレースバック(最新の呼び出しの最後):MemoryError

で、私は最終的なリストことをチェックして、ライン 31: "/ [...]/rgb_for.py C" のファイルPythonのリストの最大値よりも小さく、実際にはそれが本当です。したがって、これは何を引き起こす可能性がありますか?

答えて

1

リストを作成すると、それをCSV全体にダンプすることは間違いなく不正行為と呼ばれることがあります。あなたのプログラムが多くの行を出力する必要がありますが、途中で失敗する場合はどうなりますか?最後に出力するだけではデータが失われます。この方法は計算量が多くなります。巨大なリストをダンプする作業はかなり手間がかかるため、実行に時間がかかります。

もっと良い方法は、各行を準備が整った状態で出力することです。サイズについてはこれを試してください。

import csv 

print("Started") 

for_max = 256 

with open('spectrum.csv', 'w', newline='') as csvfile: 
    writer = csv.writer(csvfile) 
    out_list = [] 
    head = ["R", "G", "B", "Hex"] 
    writer.writerow(head) 
    for r in range(0, for_max): 
     for g in range(0, for_max): 
      for b in range(0, for_max): 
       r_hex = format(r, '02x') 
       g_hex = format(g, '02x') 
       b_hex = format(b, '02x') 
       hex_string = str("#") + str(r_hex) + str(g_hex) + str(b_hex) 
       out_list = [format(r, '03'), format(g, '03'), format(b, '03'), hex_string] 
       writer.writerow(out_list) 
print("Finished") 

この方法の追加された喜びは、出力ファイルサイズが着実に増加するのを見ることです!

関連する問題