3

我需要将非常大的数据集(在 1-10 百万条记录之间,可能更多)从特定领域的语言(其唯一的输出机制是 C 风格的fprintf语句)传输到 Python。

目前,我正在使用 DSLfprintf将记录写入平面文件。平面文件如下所示:

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

4

2 回答 2

1

Err.... 你每分钟从 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-08T04:30:04.870 回答
1

用于序列化浮点值的紧凑二进制格式在基本编码规则(BER) 中定义。在那里,它们被称为“真实”。有可用的 Python BER 实现,但也不太难编写。也有 C 的库。您可以使用这种格式(这就是它的设计目的)或变体(CER、DER)。一个这样的 Python 实现是pyasn1

于 2013-01-08T04:23:21.243 回答