LINUX.ORG.RU

[matplotlib] График большого массива данных

 


0

0

Доброго всем дня.

Есть бинарный файлик (150 Мб). В нем оцифрованы сигналы с 4 аналоговых каналов, 20 млн. точек (uint16) на каждый канал. Есть желание построить график хотябы одного канала. Но сходу не получается — matplotlib съедает много памяти (> 1Г) и его киляют.

import numpy as np
import os
from matplotlib import rc
import matplotlib.pyplot as plt

fn = u'./test/PWM-2_transient_Chaos_3.1.dat'
channels = 4
rows = os.path.getsize(f)/2/channels
print rows

X = np.memmap(f, dtype=np.int16, mode='r', shape=(rows,ch), offset=0)
# Iarm=X[:,0]
# Kf=X[:,1]
# Sync=X[:,2]
# Omega=X[:,3]

plt.plot(X)
#plt.show()
plt.savefig(fn+'.png')

PS Пока обхожусь тем, что читаю файл по частям и строю 10 отдельных графиков.

Причем для при построения графика отдельной части (15 Мб) требуется рабочее пространство процесса (по большей части heap) достигает ~700 Мб.

zensey
() автор топика

Пусть у тебя разрешение 1024x860. Ты что собрался все 20 млн. отобразить на 1024 пикселей? Надеюсь, идея понятна :)

dave ★★★★★
()
Ответ на: комментарий от dave

Идея в том, что под графиком сигнала будет график его характеристик (отображающих квазипериодичность). И характеристики эти изменяются на несколько порядков медленнее самого сигнала.

zensey
() автор топика
Ответ на: комментарий от zensey

> Идея в том, что под графиком сигнала будет график его характеристик (отображающих квазипериодичность). И характеристики эти изменяются на несколько порядков медленнее самого сигнала.

ну дык посчитай сперва требуемые параметры и уже потом выводи их на график. если их станет в конечном тоге на несколько порядков меньше. впрочем, если 'несколько порядков' == 100..1000 раз, то на 20М точек это не даст погоды :)

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

на график которого нету?

проблема даже элементарно посчитать avg(X[:,0]) -- heap разрастается до 700 Мб, причем непонятно с какой целью. А что будет на более длинных файлах? Вот так жесть как она есть.

zensey
() автор топика
Ответ на: комментарий от zensey

> проблема даже элементарно посчитать avg(X[:,0]) -- heap разрастается до 700 Мб, причем непонятно с какой целью. А что будет на более длинных файлах? Вот так жесть как она есть.

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

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

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

zensey
() автор топика
Ответ на: комментарий от zensey

> можно конечно маппить файл поблочно но вот в чем вопрос -- непосредственно после отражения файла в память размер кучи где-то 20 м, а после подсчета среднего значения -- 700 м. от последующих вычислений куча не расатет, но хотелось бы знать почему так происходит.

очевидно, это оверхед матлабовского скриптового движка. вон, попытка в ruby создать хеш целочисленных значений на пару миллионов элементов тоже не приносит много радости и памяти жрётся гигабайтами, хотя, допустим, в C/C++ это легко и просто практически без затрат.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от zensey

> при чем здесь matplotlib? речь идет о python + numpy

тфу &^%&%! я то думал мы о *матлабе* говорим :)))

впрочем, судя по полученному результату, питон от него не далеко ушел :)

// wbr

klalafuda ★☆☆
()

Уменьшить количество отображаемых точек? Должно помочь, имхо. Для расчётов, если уже так надо, оставить оригинальные вектора, а на графики выводить прореженный вариант.

aiqu6Ait ★★★★
()

используют специальные виды отображения

решают сколько раз точка попадает в каждый пиксель или участок графика и считают интенсивность которую отображать на графике.

psv1967 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.