首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只使用C风格的fprintf()语句的高效数据交换格式?

只使用C风格的fprintf()语句的高效数据交换格式?
EN

Stack Overflow用户
提问于 2013-01-08 11:54:25
回答 2查看 299关注 0票数 3

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

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

代码语言:javascript
复制
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个字符的字符串的效率非常低!):

代码语言:javascript
复制
<variable-length string> + "=" + <double-precision float>

我目前使用Python来读取每一行,并在"=“处将其拆分。

有什么我可以做的使表示更紧凑,从而使它更快地为Python读取?是否可以使用fprintf进行某种二进制编码

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-08 12:30:05

错误...您每分钟从Python读取此数据多少次?

因为在我的系统中,我可以在不到一秒的时间内读取这样一个包含2000万条记录(~400MB)的文件。

除非您是在有限的硬件上执行此操作,否则我会说您对此太过担心了。

代码语言:javascript
复制
>>> 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
票数 1
EN

Stack Overflow用户

发布于 2013-01-08 12:23:21

basic encoding rules中定义了一种用于序列化浮点值的紧凑二进制格式。在那里,他们被称为“真正的”。有一些Python的BER实现可用,但也不难编写。也有针对C语言的库。您可以使用这种格式(它就是为此而设计的),或者是一种变体(CER,DER)。pyasn1就是这样一种Python实现。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14207966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档