そこで私は、マンデルブロ集合の図を作成するこのプログラムを書いています。現在、生成された各プロセスは一時ファイルにいくつかのデータを書き込みます。この一時ファイルは、後で画像をまとめるために使用されます。ただし、現在、一時ファイルは実際の画像自体よりもかなり大きいため、それらを小さくする方法については何も考えていません. 整数データをファイルに効率的に書き込んで戻すにはどうすればよいですか? 最終的にこれを非常にスケーラブルにするつもりなので、ピクセル インデックスに任意の長さの整数を書き込めるようにする必要がありますが、カラー データは常に最大値が 255 の 3 つの整数になります。これが私のコードです。
import multiprocessing
def pixproc(y0, yn, xsteps, ysteps, fname):
XMIN, YMIN = -2., -1.
XLEN, YLEN = 3, 2
with open(fname, 'w') as f:
for y in xrange(y0, yn):
print y
for x in xrange(xsteps):
c=complex(XMIN + XLEN*(1.*x/xsteps),
YMIN + YLEN*(1.*y/ysteps))
k=c
for i in xrange(256):
k = k*k + c
if abs(k)>2: break
if 0<i<32:
#print 'Success!', i
print >>f, x, y, 8*i, 0, 0 #This is that part of
if 32<=i<255: #my code that I am trying
#print 'Success!', i #to improve. The rest of
print >>f, x, y, 255, i, i #the code is given for context
return #and isn't relevant to my question
def main(xsteps, ysteps):
pool = multiprocessing.Pool()
n = multiprocessing.cpu_count()
step = height / n
fnames = ["temp" + str(i) for i in xrange(n)]
for i in xrange(n):
pool.apply_async(pixproc,
(step*i,
step*(i+1),
xsteps,
ysteps,
fnames[i]))
pool.close()
pool.join()
return fnames
if __name__=="__main__":
from PIL import Image
import sys
width, height = map(int, sys.argv[1:])
picname = "mandelbrot1.png"
fnames = main(width, height)
im = Image.new("RGB", (width, height))
pp = im.load()
for name in fnames:
with open(name) as f:
for line in f:
line = map(int, line.rstrip('\n').split(' '))
pp[line[0], line[1]] = line[2], line[3], line[4]
im.save(picname)
3000x2000 の画像を作成しようとすると、実際の画像は 672 KB ですが、一時ファイルは両方とも 30 MB 近くあります。誰かがデータをファイルに保存するためのより良い方法を提案できますか? (重要な部分は関数 pixproc にあります)