大图:〜2000万个样本,千兆字节的数据

我有一个问题(与我的RAM)在这里:它不能保存我想要绘制的数据。 我有足够的高清空间。 有没有解决办法来避免我的数据集“阴影”?

具体来说,我处理数字信号处理,我必须使用高采样率。 我的框架(GNU无线电)保存值(以避免使用太多的磁盘空间)二进制。 我解开它。 之后我需要阴谋。 我需要情节可缩放,互动。 这是一个问题。

是否有任何优化的潜力,或其他软件/编程语言(如R左右)可以处理更大的数据集? 其实我想要更多的数据。 但是我没有其他软件的经验。 GNUplot失败,采取类似于以下的方法。 我不知道R(喷气机)。

import matplotlib.pyplot as plt import matplotlib.cbook as cbook import struct """ plots a cfile cfile - IEEE single-precision (4-byte) floats, IQ pairs, binary txt - index,in-phase,quadrature in plaintext note: directly plotting with numpy results into shadowed functions """ # unpacking the cfile dataset def unpack_set(input_filename, output_filename): index = 0 # index of the samples output_filename = open(output_filename, 'wb') with open(input_filename, "rb") as f: byte = f.read(4) # read 1. column of the vector while byte != "": # stored Bit Values floati = struct.unpack('f', byte) # write value of 1. column to a variable byte = f.read(4) # read 2. column of the vector floatq = struct.unpack('f', byte) # write value of 2. column to a variable byte = f.read(4) # next row of the vector and read 1. column # delimeter format for matplotlib lines = ["%d," % index, format(floati), ",", format(floatq), "\n"] output_filename.writelines(lines) index = index + 1 output_filename.close return output_filename.name # reformats output (precision configuration here) def format(value): return "%.8f" % value # start def main(): # specify path unpacked_file = unpack_set("test01.cfile", "test01.txt") # pass file reference to matplotlib fname = str(unpacked_file) plt.plotfile(fname, cols=(0,1)) # index vs. in-phase # optional # plt.axes([0, 0.5, 0, 100000]) # for 100k samples plt.grid(True) plt.title("Signal-Diagram") plt.xlabel("Sample") plt.ylabel("In-Phase") plt.show(); if __name__ == "__main__": main() 

像plt.swap_on_disk()这样的东西可以caching我的SSD上的东西;)

所以你的数据不是那么大,而且你在绘制时遇到了麻烦,这就说明了这些工具的问题。 Matplotlib ….不是那么好。 它有很多选项,输出很好,但它是一个巨大的内存,它从根本上假设你的数据很小。 但是还有其他的select。

所以作为一个例子,我用下面的方法生成了一个20M的数据点文件“bigdata.bin”:

 #!/usr/bin/env python import numpy import scipy.io.numpyio npts=20000000 filename='bigdata.bin' def main(): data = (numpy.random.uniform(0,1,(npts,3))).astype(numpy.float32) data[:,2] = 0.1*data[:,2]+numpy.exp(-((data[:,1]-0.5)**2.)/(0.25**2)) fd = open(filename,'wb') scipy.io.numpyio.fwrite(fd,data.size,data) fd.close() if __name__ == "__main__": main() 

这会生成大小为〜229MB的文件,这并不是那么大; 但是你已经expression了你想要更大的文件,所以你最终会达到内存限制。

让我们先专注于非交互式的情节。 首先要意识到的是,在每个点上带有字形的vector图将成为一场灾难 – 对于每个20M的点,其中大部分将重叠,尝试渲染小十字或圆或某事正在成为一个灾难,产生巨大的文件,并花费大量的时间。 这个,我想是什么在默认情况下沉没matplotlib。

Gnuplot没有问题处理这个:

 gnuplot> set term png gnuplot> set output 'foo.png' gnuplot> plot 'bigdata.bin' binary format="%3float32" using 2:3 with dots 

gnuplot的

甚至Matplotlib可以做一些谨慎的行为(select一个光栅后端,并使用像素来标记点):

 #!/usr/bin/env python import numpy import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt datatype=[('index',numpy.float32), ('floati',numpy.float32), ('floatq',numpy.float32)] filename='bigdata.bin' def main(): data = numpy.memmap(filename, datatype, 'r') plt.plot(data['floati'],data['floatq'],'r,') plt.grid(True) plt.title("Signal-Diagram") plt.xlabel("Sample") plt.ylabel("In-Phase") plt.savefig('foo2.png') if __name__ == "__main__": main() 

matplotlib

现在,如果你想交互式的,你将不得不把数据进行绘图,并放大。 我不知道任何Python工具,这将帮助你做这个副手。

另一方面,绘图 – 大数据是一个相当普遍的任务,并且有工具可以胜任。 Paraview是我个人的最爱, VisIt是另一个。 它们都是主要用于3D数据的,但是Paraview特别也是2d的,并且是非常交互的(甚至有一个Python脚本接口)。 唯一的技巧是将数据写入Paraview可以轻松阅读的文件格式。

你当然可以优化你的文件的阅读:你可以直接读取到一个NumPy数组,以利用NumPy的原始速度。 你有几个select。 如果RAM是一个问题,您可以使用memmap ,它将大部分文件保留在磁盘上(而不是RAM中):

 # Each data point is a sequence of three 32-bit floats: data = np.memmap(filename, mode='r', dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')]) 

如果RAM不是一个问题,你可以把整个数组放在RAM中,使用fromfile :

 data = np.fromfile(filename, dtype=[('index', 'float32'), ('floati','float32'), ('floatq', 'float32')]) 

然后可以通过Matplotlib通常的plot(*data)function完成绘图,可能通过另一个解决scheme中提出的“放大”方法。

最近的一个项目对于大数据集具有很大的潜力: Bokeh ,正是为了这个而创build的。

实际上,只有与图表比例相关的数据被发送到显示后端。 这种方法比Matplotlib方法快得多。

我会build议一些有点复杂,但应该工作:build立在不同分辨率,不同范围的graphics。

例如,想一想Google地球。 如果以最高的水平放大以覆盖整个星球,分辨率是最低的。 当你缩放的时候,图片会变得更加细致,但是只是放大的区域。

所以基本上对于你的情节(是2D还是2D?我假设它是2D),我build议你用低分辨率构build一个覆盖整个[0,n]范围的大图,覆盖[0,n / 2]和[n / 2 + 1,n],其中两个分辨率是大分辨率的两倍,四个较小的图表覆盖[0,n / 4] … [3 * n / 4 + 1,n]上述2的解决scheme等等。

不知道我的解释是非常清楚的。 此外,我不知道这种多分辨率图是否由任何现有的剧情程序处理。

我想知道是否有一个胜利,加快查询你的观点? (我一直对R *(r星)树感兴趣。)

我想知道在这种情况下使用类似r *树的东西是否可以成为现实。 (当缩小时,树中较高的节点可能包含较粗糙的信息,缩小的渲染,朝向叶子的节点包含单独的样本)

甚至内存映射树(或任何你最终使用的结构)到内存中,以保持你的性能和你的内存使用率低。 (你将内存pipe理任务卸载到内核)

希望是有道理的..漫不经心。 晚了!