Итак, я пишу эту программу, которая создает картину набора мандельбротов, и я постепенно улучшал ее. прямо сейчас, каждый процесс, который порожден, записывает некоторые данные во временный файл, который используется позже, чтобы сместить изображение вместе. Прямо сейчас, однако, временные файлы ALOT больше, чем фактическое изображение, и у меня нет никаких идей о том, как их уменьшить. Как эффективно записывать целочисленные данные в файл и возвращать его? Я намерен в конечном итоге сделать это очень масштабируемым, поэтому мне нужно было бы писать произвольно длинные целые числа для индексов пикселей, но данные цвета всегда будут иметь три целых числа, которые имеют максимальное значение 255. Вот мой код:Как сделать небольшие временные файлы?
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 МБ! Может ли кто-нибудь предложить лучший способ хранения данных в файлах? (Важная часть в функции pixproc)
Первое: фактическое изображение - 672 КБ _compressed_. Если у вас есть файл 3Kx2K с, скажем, RGB8 пикселями, это 18 МБ несжатого. Таким образом, накладные расходы составляют около 75%. Вы хотите уменьшить это на 75% до минимума или сжать временные данные? – abarnert
Во-вторых, вы можете использовать 'numpy' вместо того, чтобы делать все явно? Помимо того факта, что передача по огромному массиву numpy обычно на порядок быстрее, чем итерация по огромному списку Python, у numpy есть встроенный код для сохранения массивов как можно компактнее. – abarnert
Ну, я использовал numpy, поэтому лично знаю, как быстро. Но я никогда не делаю никаких огромных списков python, и у меня всегда были проблемы с использованием numpy с многопроцессорной обработкой. Я пытаюсь сохранить все хранилище данных на своем диске. – Broseph