读取 1 GB 文件以获取记录在其中的时间序列数据并生成包含两个列(一个时间和另一个数字)的实时图表的最佳方法是什么?我看到你有不同的方式来调整文件。
问问题
3468 次
3 回答
7
听起来RRDTool的工作不错。
但是如果你想坚持使用 Python,我会使用 tail 将数据流式传输到我的程序中(这是假设文件被连续写入,否则 Python 中的直接 open() 将起作用)。
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
于 2009-11-11T01:07:23.913 回答
2
正如约翰所提到的,您可以将尾部输出输入到您的文件中,但是如果您由于某种原因想要处理文件中的所有内容并且还想要一个有点动态图的示例,这里是
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()
您可以从中获取元素,我认为它会解决您的问题。
于 2009-11-11T04:31:11.187 回答
2
这是具有 3 个部分的 unix 管道:tail'er、过滤器(gawk)和绘图仪(python)。
tail -f yourfile.log | gawk '/PCM1/{print $21; fflush();}' | python -u tailplot.py
这是python脚本。您可以为其提供 1 (y) 或 2 (xy) 列数据。如果您不使用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()
于 2014-10-24T18:32:01.827 回答