Большой PyPlot - избежать выделения памяти - PullRequest
1 голос
/ 15 апреля 2011

Я делаю довольно большой PyPlot (Python matplotlib) (600000 значений, каждое 32-битное).Практически, я думаю, я мог бы просто сделать что-то вроде этого:

import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 6, 0, 20])

Два массива, оба размещены в памяти.Однако рано или поздно мне придется печатать файлы, которые содержат несколько гигабайт этой информации.

Как мне избежать передачи двух массивов в plt.plot()?

Мне все еще нужен полный сюжет.Так что просто итератор и передача значений построчно не могут быть сделаны, я полагаю.

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Если вы говорите о гигабайтах данных, вы можете рассмотреть возможность загрузки и построения точек данных в пакетном режиме, а затем наложить данные изображения каждого визуализированного графика на предыдущий.Вот быстрый пример с комментариями:

import Image
import matplotlib.pyplot as plt
import numpy

N = 20
size = 4
x_data = y_data = range(N)

fig = plt.figure()

prev = None
for n in range(0, N, size):
    # clear figure
    plt.clf()

    # set axes background transparent for plots n > 0
    if n:
        fig.patch.set_alpha(0.0)
        axes = plt.axes()
        axes.patch.set_alpha(0.0)

    plt.axis([0, N, 0, N])

    # here you'd read the next x/y values from disk into memory and plot
    # them.  simulated by grabbing batches from the arrays.
    x = x_data[n:n+size]
    y = y_data[n:n+size]
    ax = plt.plot(x, y, 'ro')
    del x, y

    # render the points
    plt.draw()

    # now composite the current image over the previous image
    w, h = fig.canvas.get_width_height()
    buf = numpy.fromstring(fig.canvas.tostring_argb(), dtype=numpy.uint8)
    buf.shape = (w, h, 4)
    # roll alpha channel to create RGBA
    buf = numpy.roll(buf, 3, axis=2)
    w, h, _ = buf.shape
    img = Image.fromstring("RGBA", (w, h), buf.tostring())
    if prev:
        # overlay current plot on previous one
        prev.paste(img)
        del prev
    prev = img

# save the final image
prev.save('plot.png')

Вывод:

enter image description here

0 голосов
/ 15 апреля 2011

Вам действительно нужно строить отдельные точки?Кажется, что график плотности будет работать так же хорошо, с таким количеством доступных точек данных.Вы можете заглянуть в hexbin Pylab или numpy.histogram2d.Для таких больших файлов вам, вероятно, придется использовать numpy.memmap или работать в пакетном режиме, как говорит @samplebias.

...