Хвост прочитать растущий динамический файл и извлечь два столбца, а затем распечатать график
Каков наилучший способ прочитать файл объемом 1 ГБ, в котором записаны данные временных рядов, и сгенерировать график в реальном времени с двумя его столбцами (один раз, а другой - число)? Я вижу, что у вас есть разные способы настройки файла.
3 ответа
Похоже, хорошая работа для RRDTool.
Но если вы хотите придерживаться Python, я бы использовал tail для потоковой передачи данных в мою программу (это предполагает, что файл постоянно записывается, иначе будет работать прямое open() в Python).
tail -F data.log | python myprogram.py
myprogram.py может выглядеть примерно так:
import sys
p = ... # create a pylab plot instance
for line in sys.stdin:
elements = line.split(',') # or whatever separator your file has in it
p.add(element[0], element[1]) # add data to the pylab plot instance
Вот канал Unix, который состоит из 3 частей: tail'er, фильтра (gawk) и плоттера (python).
tail -f yourfile.log | gawk '/PCM1/{print $21; fflush();}' | python -u tailplot.py
и вот сценарий Python. Вы можете кормить его 1 (у) или 2 (ху) столбцами данных. Если вы не используете gawk
, обязательно выясните, как отключить буферизацию. sed -u
например.
pa-poca$ cat ~/tailplot.py
import math
import time
import sys
import pylab
pylab.ion()
pylab.xlabel("X")
pylab.ylabel("Y")
x = []
y = []
counter = 1
while True :
line = sys.stdin.readline()
a = line.split()
if len(a) == 2:
x.append(a[0])
y.append(a[1])
elif len(a) == 1:
x.append(counter)
y.append(a[0])
counter = counter + 1
pylab.plot(x, y, 'b')
pylab.draw()
Как упоминал Джон, вы можете ввести хвостовой вывод в ваш файл, но если по какой-то причине вы хотите обработать все в вашем файле, а также хотите получить пример несколько динамического графа, вот он
import math
import time
import pylab
def getDataTest(filePath):
s = 0
inc = .05
x_list=pylab.arange(0, 5.0, 0.01)
while 1:
s += inc
if abs(s) > 1:
inc=-inc
y_list = []
for x in x_list:
x += s
y = math.cos(2*math.pi*x) * math.exp(-x)
y_list.append(y)
yield x_list, y_list
def tailGen(filePath):
f = open(filePath)
#f.seek(0, 2) # go to end
for line in f: yield line
while 1:
where = f.tell()
line = f.readline()
if line:
yield line
else:
time.sleep(.1)
f.seek(where)
def getData(filePath):
x_list = []
y_list = []
maxCount = 10
for line in tailGen(filePath):
# get required columns
tokens = line.split(",")
if len(tokens) != 2:
continue
x, y = tokens
x_list.append(x)
y_list.append(y)
if len(x_list) > maxCount:
x_list = x_list[-maxCount:]
y_list = x_list[-maxCount:]
yield x_list, y_list
pylab.ion()
pylab.xlabel("X")
pylab.ylabel("Y")
dataGen = getData("plot.txt") # getDataTest("plot.txt") #
x_list, y_list = dataGen.next()
plotData, = pylab.plot(x_list, y_list, 'b')
#pylab.show()
pylab.draw()
for (x_list, y_list) in dataGen:
time.sleep(.1)
plotData, = pylab.plot(x_list, y_list, 'b')
pylab.draw()
Вы можете забрать элементы из него, и я думаю, что это решит вашу проблему.