首页> 中国专利> 数据格式转换系统及其方法

数据格式转换系统及其方法

摘要

本发明公开了一种数据格式转换方法,包括:文件生成步骤,基于Protobuf以自定义或编写的文件名为xxx的Proto文件xxx.proto为输入,生成包含同一文件名的xxx_pb2.py代码,并以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp以及template.cfg.pybind.cpp,获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp以及Python端代码文件xxx.cfg.pybind.cpp,其中C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp为Pybind11对应的文件,用于将C++的接口导出到Python端;以及注册步骤,采用注册机制将所生成的xxx.cfg.pybind.cpp中定义的模块自动导出到Python。

著录项

  • 公开/公告号CN112379886A

    专利类型发明专利

  • 公开/公告日2021-02-19

    原文格式PDF

  • 申请/专利权人 北京一流科技有限公司;之江实验室;

    申请/专利号CN202011377942.3

  • 申请日2020-11-30

  • 分类号G06F8/41(20180101);G06F8/30(20180101);

  • 代理机构11554 北京金讯知识产权代理事务所(特殊普通合伙);

  • 代理人黄剑飞

  • 地址 100083 北京市海淀区王庄路1号院2号楼4层5-E-1

  • 入库时间 2023-06-19 09:57:26

说明书

技术领域

本公开涉及一种数据处理技术。更具体地说,本公开涉及一种数据格式转换系统及其方法。

背景技术

序列化(serialization)在计算机科学的资料处理中,是指将数据结构或对象状态转换成可取用格式(例如存成文件,存于缓冲,或经由网络中发送),以留待后续在相同或另一台计算机环境中,能恢复原先状态的过程。依照序列化格式重新获取字节的结果时,可以利用它来产生与原始对象相同语义的副本。对于许多对象,例如是使用大量引用的复杂对象,这种序列化重建的过程并不容易。面向对象中的对象序列化,并不概括之前原始对象所关系的函数。这种过程也称为对象编组(marshalling)。从一系列字节提取数据结构的反向操作,是反序列化(也称为解编组、deserialization、unmarshalling)。

现有主流序列化工具,类似Protobuf等工具,其支持跨平台、跨语言。尽管这些序列化工具已经在时间和空间上做了足够多的优化,具有空间开销小以及高解析性能等亮点,但在某些大型系统场景下(如oneflow系统eager模式下),每执行一条语句都要进行多次跨语言之间的信息交换,每一次信息交换都会伴随着结构化数据序列化和反序列化,当数据量较小时,在这样异常频繁的进行前后端数据交互的系统中,针对小块数据的序列化和反序列化过程将会严重影响系统运行效率。

因此,人们希望在使用Protobuf等工具时,能够有一种数据格式转换手段,其能够消除跨语言之间的序列化和反序列化过程,从而提高系统的运行效率。

发明内容

为此,为解决上述技术问题,本公开提供了一种快速的数据格式交换工具(简称“CFG”),概括而言,其以Protobuf做为语言翻译中间工具,将结构定义文件(.proto文件)转换为对应的C++程序,并将其接口通过Pybind11导出到Python端。

具体而言,根据本公开的一个方面,提供了一种数据格式转换方法,包括:文件生成步骤,基于Protobuf以自定义或编写的文件名为xxx的Proto文件xxx.proto为输入,生成包含同一文件名的xxx_pb2.py代码,并以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp以及template.cfg.pybind.cpp,获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp以及Python端代码文件xxx.cfg.pybind.cpp,其中C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp为Pybind11对应的文件,用于将C++的接口导出到Python端;以及注册步骤,采用注册机制将所生成的xxx.cfg.pybind.cpp中定义的模块自动导出到Python。

根据本公开的数据格式转换方法,其中所述注册步骤包括:将各模块以xxx.proto中的包名为路径,自动注册到注册表中;以及将注册表中的各模块自动递归地在Python端导出对应的子模块。

根据本公开的数据格式转换方法,其中还包括:运行步骤,利用智能指针shared_ptr在C++和Python两种语言之间传输对象信息。

根据本公开的数据格式转换方法,其中所述文件生成步骤还包括:以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,通过pybind11将C++端的XXX对象封装为ConstXXX和XXX两种类型的Python对象,其中ConstXXX对象提供只读接口,XXX对象提供读写接口,以便实现在Python端的读写分离。

根据本公开的数据格式转换方法,其中所述文件生成步骤还包括:以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,使得C++端代码文件中定义的对象具有写时复制机制。

根据本公开的数据格式转换方法,其中所述写时复制机制对于一个树状结构的对象,在当前对象为不可变对象时,只对当前对象节点其进行浅拷贝而不拷贝其子节点,而在当前对象为可变对象时,对当前对象节点及其子树中的对象节点其进行递归深拷贝。

根据本公开的另一个方面,提供了一种数据格式转换系统,包括:自定义或编写组件,自定义或编写的文件名为xxx的Proto文件xxx.proto,基于Protobuf以Proto文件xxx.proto为输入生成包含同一文件名的xxx_pb2.py代码;文件生成组件,以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp以及template.cfg.pybind.cpp,获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp以及Python端代码文件xxx.cfg.pybind.cpp,其中C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp为Pybind11对应的文件,用于将C++的接口导出到Python端;以及注册组件,采用注册机制将所生成的xxx.cfg.pybind.cpp中定义的模块自动导出到Python。

根据本公开的数据格式转换系统,其中所述注册组件还将各模块以xxx.proto中的包名为路径,自动注册到注册表中,以及将注册表中的各模块自动递归地在Python端导出对应的子模块。

根据本公开的数据格式转换系统,其中所述文件生成组件在以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,通过pybind11将C++端的XXX对象封装为ConstXXX和XXX两种类型的Python对象,其中ConstXXX对象提供只读接口,XXX对象提供读写接口,以便实现在Python端的读写分离。

根据本公开的数据格式转换系统,其中所述文件生成组件在以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,使得C++端代码文件中的对象具有写时复制机制。

根据本公开的数据格式转换系统和方法能够将C++和Python两种语言之间的数据交换开销降低到几乎为0,极大的提高了结构转换数据的跨语言信息传输效率。

本发明的其它优点、目标和特征将部分通过下面的说明体现,部分还将通过对本发明的研究和实践而为本领域的技术人员所理解。

附图说明

图1所示的是根据本公开的数据格式转换系统的原理示意图。

图2所示的是根据本公开的数据格式转换方法的流程图。

图3所示的根据本公开的数据格式转换方法中之策的模块自动导出到Python端的示意图。

图4所示的是根据本公开的渲染过程中对C++端的对象接口进行分类封装的示意图。

图5所示的是根据本公开的渲染过程中对C++端的形成写时复制的示意图。

图6所示的是根据本公开的数据格式转换系统的组件化示意图。

具体实施方式

下面结合实施例和附图对本发明做进一步的详细说明,以令本领域技术人员参照说明书文字能够据以实施。

这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。

在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,在下文中,两个可能设备之一可以被称为第一组件也可以被称为第二组件,类似地,两个可能设备的另一个可以被称为第二组件也可以被称为第一组件。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

为了使本领域技术人员更好地理解本公开,下面结合附图和具体实施方式对本公开作进一步详细说明。

图1所示的是数据格式转换系统的原理示意图。如图1所示,自定义或编写的文件名为xxx的Proto文件xxx.proto为输入,基于Protobuf以Proto文件xxx.proto为输入生成包含同一文件名的xxx_pb2.py代码,并以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp以及template.cfg.pybind.cpp,获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp以及Python端代码文件xxx.cfg.pybind.cpp,实现数据格式的转换。C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp为Pybind11对应的文件,用于将C++的接口导出到Python端。Pybind11可实现C++与Python互相调用。关于python调用C++官方文档给出了详细的配置方法及函数使用,不再赘述。C++调用python主要使用embed头文件实现,也不再赘述。随后采用注册机制将所生成的xxx.cfg.pybind.cpp中注册的模块自动导出到Python端,以及将C++端代码文件导出为后端C++文件。

图2所示的是数据格式转换系统的流程图。如图2所示,首先,在步骤S210处,自定义/编写所要转换的结构定义文件xxx.proto。随后在步骤S202处,通过ProtoBuf基于结构定义文件xxx.proto生成包含同一文件名的xxx_pb2.py代码。为了将使得前端和后端之间在进行通讯时消除序列化和反序列化的开销,可以使得作为前端的Python端可以直接调用C++代码,采用Pybind11可实现C++与Python互相调用。为此,在步骤S230处,以xxx_pb2.py为输入利用Python标准模块Jinja2填充模板文件template.cfg.pybind.cpp获得Python端代码文件xxx.cfg.pybind.cpp,该代码文件为Pybind11对应的文件;同时,以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp,获得得到与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp。C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp将C++的接口导出到Python端。随后在步骤S240处,采用注册机制将所生成的xxx.cfg.pybind.cpp中注册的模块自动导出到Python端,以及将C++端代码文件导出为后端C++文件。图3所示的根据本公开的数据格式转换方法中之策的模块自动导出到Python端的示意图。如图3所示,注册机制将CFG模板文件生成部分生成的xxx.cfg.pybind.cpp中注册的模块自动导出到Python端。首先,各模块以xxx.proto中的包名为路径,自动注册到注册表中。其次,将注册表中的各模块自动递归地在Python端导出对应的子模块。

可选择地,为了在随后的运行时,使得前后端通过共享同一块内存,一方面减少内存需求,另一方面减少传输开销,可以在渲染模板时,对同一传输对象在前段代码和后端代码之间采用智能指针shared_ptr。这样在运行时,利用智能指针shared_ptr在C++和Python两种语言之间传输对象信息,本质上前后端操作的是同一块内存,二者之间仅仅传输一个智能指针对象,不存在实质上的传输开销。

可选择地,在步骤S230中,在以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,通过pybind11将C++端的XXX对象封装为ConstXXX和XXX两种类型的Python对象,其中ConstXXX对象提供只读接口,XXX对象提供读写接口,以便实现在Python端的读写分离。图4所示的是根据本公开的渲染过程中对C++端的对象进行分类封装的示意图。

可选择地,以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp时,使得C++端代码文件中定义的对象具有写时复制机制。写时复制(copy on write)技术,也即就是只有对象中的成员变量的内容要发生变化时,才会将该成员变量的内容的内容复制一份。图5所示的是根据本公开的渲染过程中对C++端的形成写时复制的示意图。如图5所示,CFG中的对象通过布尔型成员变量标识自身内容是否可变,默认值为false。将对象看作一个树状结构,当前对象为不可变对象(C)时,其整个子树必然为不可变对象,只需对当前节点其进行浅拷贝;当前对象为可变对象(U)时,对当前节点及其子树中的节点其进行递归深拷贝,递归结束条件有两个:1、叶子节点,结束拷贝;2、节点为不可变节点,对当前节点做浅拷贝操作。

图6所示的是根据本公开的数据格式转换系统的组件化示意图。如图6所示,数据格式转换系统包括:编译组件610,自定义/编写Proto文件xxx.proto,并基于所获得Proto文件xxx.proto,生成包含同一文件名的xxx_pb2.py代码;文件生成组件620,以xxx_pb2.py为输入利用Python标准模块Jinja2分别填充模板文件template.cfg.h、template.cfg.cpp以及template.cfg.pybind.cpp,获得与xxx.proto文件中的结构化数据对应的C++端代码文件xxx.cfg.h、xxx.cfg.cpp以及Python端代码文件xxx.cfg.pybind.cpp,其中C++端代码文件xxx.cfg.h、xxx.cfg.cpp中包含结构化数据对应的C++对象,其对象的接口与ProtoBuf对齐,而Python端代码文件xxx.cfg.pybind.cpp为Pybind11对应的文件,用于将C++的接口导出到Python端;以及注册组件630,采用注册机制将所生成的xxx.cfg.pybind.cpp中注册的模块自动导出到Python端,以及将C++端代码文件导出为后端C++文件。最后运行组件640分别在Python端运行Python端代码文件xxx.cfg.pybind.cpp以及在C++端运行C++端代码文件xxx.cfg.h、xxx.cfg.cpp。由于采用Pybind11,可实现使得作为前端的Python端可以直接调用C++代码,使得前端和后端之间在进行通讯时消除序列化和反序列化的开销。

以上结合具体实施例描述了本公开的基本原理,但是,需要指出的是,对本领域的普通技术人员而言,能够理解本公开的方法和装置的全部或者任何步骤或者部件,可以在任何计算装置(包括处理器、存储介质等)或者计算装置的网络中,以硬件、固件、软件或者它们的组合加以实现,这是本领域普通技术人员在阅读了本公开的说明的情况下运用他们的基本编程技能就能实现的。

因此,本公开的目的还可以通过在任何计算装置上运行一个程序或者一组程序来实现。所述计算装置可以是公知的通用装置。因此,本公开的目的也可以仅仅通过提供包含实现所述方法或者装置的程序代码的程序产品来实现。也就是说,这样的程序产品也构成本公开,并且存储有这样的程序产品的存储介质也构成本公开。显然,所述存储介质可以是任何公知的存储介质或者将来所开发出来的任何存储介质。

还需要指出的是,在本公开的装置和方法中,显然,各部件或各步骤是可以分解和/或重新组合的。这些分解和/或重新组合应视为本公开的等效方案。并且,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以并行或彼此独立地执行。

上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,取决于设计要求和其他因素,可以发生各种各样的修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号