我需要将非常大的数据集(在1-10mil记录之间,可能更多)从特定于域的语言(其唯一的输出机制是C风格的fprintf语句)传输到Python.
目前,我正在使用DSL的fprintf将记录写入平面文件。平面文件如下所示:
x['a',1,2]=1.23456789012345e-01
x['a',1,3]=1.23456789012345e-01
x['a',1,4]=1.23456789012345e-01
y1=1.23456789012345e-01
y2=1.23456789012345e-01
z['a',1,2]=1.23456789012345e-01
z['a',1,3]=1.23456789012345e-01
z['a',1,4]=1.23456789012345e-01正如您所看到的,每个记录的结构都非常简单(但是将双精度浮点型表示为20个字符的字符串的效率非常低!):
<variable-length string> + "=" + <double-precision float>我目前使用Python来读取每一行,并在"=“处将其拆分。
有什么我可以做的使表示更紧凑,从而使它更快地为Python读取?是否可以使用fprintf进行某种二进制编码
发布于 2013-01-08 12:30:05
错误...您每分钟从Python读取此数据多少次?
因为在我的系统中,我可以在不到一秒的时间内读取这样一个包含2000万条记录(~400MB)的文件。
除非您是在有限的硬件上执行此操作,否则我会说您对此太过担心了。
>>> timeit("all(b.read(20) for x in xrange(0, 20000000,20) ) ", "b=open('data.dat')", number=1)
0.2856929302215576
>>> c = open("data.dat").read()
>>> len(c)
380000172发布于 2013-01-08 12:23:21
basic encoding rules中定义了一种用于序列化浮点值的紧凑二进制格式。在那里,他们被称为“真正的”。有一些Python的BER实现可用,但也不难编写。也有针对C语言的库。您可以使用这种格式(它就是为此而设计的),或者是一种变体(CER,DER)。pyasn1就是这样一种Python实现。
https://stackoverflow.com/questions/14207966
复制相似问题