共享内存结构缓冲区

sharedbuffers的Python项目详细描述


这个库实现了可以读取和操作的共享内存类型的缓冲区(我们最终将 支持写入)没有序列化或反序列化的高效。

获取共享内存的主要支持实现是通过内存映射文件,但是库也支持 映射缓冲区(匿名mmap对象)也一样,尽管它们很难在进程之间共享。

支持的primivite类型:

  • int (up to 64 bit precision)
  • str (bytes)
  • unicode
  • frozenset
  • tuple / list
  • dict
  • buffer
  • date
  • datetime
  • numpy arrays
  • decimal

基本类型可以克隆到它们的实际内置对象中(由映射类型指定),这很快, 但潜在的记忆密集型。此外,它们可以代理,在这种情况下,它们将直接构建。 在内存映射之上,无需构造实际对象。代理对象瞄准支持 与内置容器的接口相同。

对象可以用模式序列化程序注册,因此也可以映射复合类型。让它发挥作用 正确地说,对象需要一个类属性来指定它所包含的属性和属性的类型。当 属性没有明确定义的类型,可以通过将其指定为 键入对象

例如:

classSomeStruct(object):__slot_types__={'a':int,'b':float,'s':str,'u':unicode,'fset':frozenset,'l':list,'o':object,}__slots__=__slot_types__.keys()

但是,添加\u slot\u types\uuuu不足以使对象可映射。需要创建架构定义, 它可以用来映射文件或缓冲区,并获得对以下信息的代理:

classSomeStruct(object):__slot_types__={'a':int,'b':float,'s':str,'u':unicode,'fset':frozenset,'l':list,'o':object,}__slots__=__slot_types__.keys()__schema__=mapped_struct.Schema.from_typed_slots(__slot_types__)

因此,使用模式非常简单:

s=SomeStruct()s.a=3s.s='blah's.fset=frozenset([1,3])s.o=3s.__schema__.pack(s)# returns a bytearraybuf=bytearray(1000)# writes in offset 10 of buf, returns the size of the written objects.__schema__.pack_into(s,buf,10)# returns a proxy for the object just packed into buf, does not deserializep=s.__schema__.unpack_from(s,buf,10)printp.aprintp.sprintp.fset

声明复合类型

类型化对象可以嵌套,但为此,必须为每种类型分配一个类型代码,才能正确地 确定自定义类型:

SomeStruct.__mapped_type__=mapped_struct.mapped_object.register_schema(SomeStruct,SomeStruct.__schema__,'S')

从那时起,somestruct可以在声明字段类型时用作任何其他类型。

容器结构

通过继承适当的基类,可以创建高级类型的container类。

这些高级容器对象的api针对的是不适合在其ram中使用的集合。 纯python形式,因此必须使用对项的迭代器(理想情况下是不使用 立即将整个集合放入内存中),然后从结果文件或缓冲区映射。

目前,支持三种类型的映射:字符串到对象、uint到对象和泛型对象到对象。 前两个是为了提高效率而提供的;当其他的不能提供时,使用通用的。

classStructArray(mapped_struct.MappedArrayProxyBase):schema=SomeStruct.__schema__classStructNameMapping(mapped_struct.MappedMappingProxyBase):IdMapper=mapped_struct.StringIdMapperValueArray=StructArrayclassStructIdMapping(mapped_struct.MappedMappingProxyBase):IdMapper=mapped_struct.NumericIdMapperValueArray=StructArrayclassStructObjectMapping(mapped_struct.MappedMappingProxyBase):IdMapper=mapped_struct.ObjectIdMapperValueArray=StructArray

例如:

withtempfile.NamedTemporaryFile()asdestfile:arr=StructArray.build([SomeStruct(),SomeStruct()],destfile=destfile)printarr[0]withtempfile.NamedTemporaryFile()asdestfile:arr=StructNameMapping.build(dict(a=SomeStruct(),b=SomeStruct()).iteritems(),destfile=destfile)printarr['a']withtempfile.NamedTemporaryFile()asdestfile:arr=StructIdMapping.build({1:SomeStruct(),3:SomeStruct()}.iteritems(),destfile=destfile)printarr[3]

使用嵌套层次结构时,可以通过指定idmapdict统一对同一对象的引用。 但是,由于id map将通过对象的id()映射对象,因此必须通过保存对 它们仍然在idmap中被引用,因此它的使用是非常重要的。示例技巧:

defall_structs(idmap):iter_all=iter(some_generator)whileTrue:idmap.clear()sstructs=list(itertools.islice(iter_all,10000))ifnotsstructs:breakforssinsstructs:# mapping from "s" attribute to structyield(ss.s,ss)delsstructsidmap={}name_mapping=StructNameMapping.build(all_structs(idmap),destfile=destfile,idmap=idmap)

上面的代码同步对象及其idmap条目的生存期,以避免映射问题。如果不变量 不维护(idmap中引用的对象是活动的,并且保存唯一的id()值),结果将是 由于对象标识混淆导致的结果映射的静默损坏。

映射代理类及其关联的id映射器类的变体实现了多个映射。 也就是说,当为一个键输入多个值时,将返回该键的值列表的映射 而不是一把钥匙。它们的内存表示是相同的,但是它们的查询api返回所有匹配的值 而不是第一个,所以多映射和简单映射是二进制兼容的。

具有字符串键的多个映射也可以是近似的,这意味着原始密钥将被丢弃,并且映射将 只使用散列,使地图更快、更紧凑,而牺牲了一些inacc乌拉西哪里 返回的值可以有额外的值,这些值对应于散列与所请求的散列冲突的其他键。

运行测试

运行测试可以在本地进行,也可以在Docker上进行,使用脚本run tests.sh

$> virtualenv venv
$> . venv/bin/activate
$> sh ./run-tests.sh

或者,可以使用以下命令在Docker上运行它:

$> docker run -v ${PWD}:/opt/sharedbuffers -w /opt/sharedbuffers python:2.7 /bin/sh run-tests.sh

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用spring并在CXF中生成服务器和客户端   重载是否可以重载抽象Java类中的抽象方法,但只实现子类中的一个重载方法?   javawhy系统。currentTimeMillis()是否生成不正确的长值?   java使用Apache POI API将xlsx转换为csv   资源Java找不到文件?   java APDU命令验证返回6a88   JAVAlang.ExceptionInInitializerError是在交换机中构造对象时创建的   java使用嵌套while循环打印星形金字塔   sql Java ResultSet获取返回的字段名   java无法将字符串更改为整数,因为负号跟在数字后面   为什么番石榴/爪哇使用“可能”。isPresent()与可选项相反。是否显示(可能)?   JavaJUnit4看不到bean   JavaJBoss以错误的顺序启动servlet   java无法下载Maven依赖项AnypointStudio   安卓如何在java中存储持久数据   java SQL Server JDBC的驱动程序类名是什么   java中针对大输入的性能优化BufferedReader   java eclipse自动完成内容助理