用于数据输入/输出、导入和导出的多维数据集

cubicweb-dataio的Python项目详细描述


大量存储

这家大型商店是一家cw商店,用来推销大量商品。 使用纯sql逻辑的数据,从而避免了cw检查。 它比其他cw存储更快(它不会在每个步骤检查eid, 它使用copy-from方法),但不太安全(没有数据完整性安全性)。 使用create_entity函数时不返回EID。

警告:此存储目前只能与PostgreSQL一起使用,因为 依赖于copy from方法和特定的postgresql表 获取所有索引。

大卖场工作流程

庞大的门店工作流程如下:

< Buff行情>
  • 从元数据表(实体,是…的实例)中删除索引和约束;

  • 数据插入:

    < Buff行情>
    • 使用 为实体创建实体 函数;
    • 对关系使用 relate 函数;
    • 对基于外部标识符的关系使用 related\u by\u iid 函数;
    • 每次插入尚未看到的rtype都将触发 为此rtype创建一个临时表,以存储结果。
    • 每次插入一个尚未看到的etype都将删除所有 实体表上的索引/约束。
  • 在给定的点上,应该调用 flush 方法:

    < Buff行情>
    • 它将根据从
    • 中复制的数据将实体数据刷新到数据库中。
    • 它将根据从
    • 复制关系数据,将关系数据刷新到数据库中。
    • 它将基于从中复制的关系iid数据刷新到数据库中
    • 它将为插入的实体创建元数据(实体,…)。
    • 它将承诺。
  • 如果某些关系是基于外部标识符创建的( relate\u by\u iid ), 应使用 convert_relations 方法手动完成转换。

  • 在插入结束时,应该调用 cleanup 方法:

    < Buff行情>
    • 它将为实体/关系表重新创建索引/约束/主键。
    • 它将在元数据表上重新创建索引/约束。
    • 它将删除临时表和内部存储表。

海量存储中的实体/关系

由于数据库插入的技术限制,需要注意以下几点:

< Buff行情>
  • 调用create_entity将返回具有特定id的实体。EID自动处理 通过大规模存储(它将获取给定范围的eid以供内部使用),但是您可以 在 创建实体的kwargs中传递特定的eid,以绕过eid的自动分配。
  • relate 方法不支持内联关系。

将为调用postgresql copy_from 子句创建缓冲区。 如果在实体(或关系)的数据中找到用于创建此表格文件的分隔符, 它将被商店的 替换sep 替换(默认为"")。

海量存储的基本用途

使用海量存储的简单脚本:

# Initialize the store
store = MassiveObjectStore(session)
# Initialize the Relation table
store.init_rtype_table('Person', 'lives', 'Location')

# Import logic
...
entity = store.create_entity('Person', ...)
entity = store.create_entity('Location', ...)

# Flush the data in memory to sql database
store.flush()

# Import logic
...
entity = store.create_entity('Person', ...)
entity = store.create_entity('Location', ...)
# Person_iid and location_iid are unique iid that are data dependant (e.g URI)
store.relate_by_iid(person_iid, 'lives', location_iid)
...

# Flush the data in memory to sql database
store.flush()

# Convert the relation
store.convert_relations('Person', 'lives', 'Location')

# Clean the store / rebuild indexes
store.cleanup()

在这种情况下,iid subj和iid obj代表一个唯一的id 可用于创建 导入实体后的关系。

大规模存储的高级使用

大规模存储的简单默认使用是保守的 避免元数据MA中的问题管理。但是有可能 提高插入速度:

  • 如果刷新元数据的次数过多,则可能代价高昂。 一个好的做法是在进口结束时只做一次。 为此,应在创建存储时将 autoflush_metadata 设置为false, 您应该在导入结束时调用 刷新元数据 ( 但在调用"cleanup"之前)
  • 您可以通过设置 commit\u at\u flush来避免每次刷新时提交 在商店创建中为false。所以你应该明确地 在刷新元数据之前, commit 方法至少一次 打扫商店
  • 您可以使用 商店创建期间的 drop_index 属性。
  • 您可以使用 在商店创建期间, eids\u seq\u start 属性。
  • 可以提供额外的回调来处理提交和回滚 ( 关于提交回调 关于回滚回调 )。

大规模存储的高级使用示例:

store = MassiveObjectStore(session,
                           autoflush_metadata=False,
                           commit_at_flush=False)
store.init_rtype_table('Location', 'names', 'LocationName')
for ind, infos in enumerate(ucsvreader(open(dumpname))):
    entity = {'name': infos[1], ...}
    entity['my_inlined_relation'] =  my_dict.get(infos[2])
    entity = store.create_entity('Location', **entity)
    store.relate_by_iid(entity.cwuri, 'my_external_relation', infos[3])
    if ind and ind % 200000 == 0:
        store.flush()
        store.commit()
store.flush()
store.commit()
store.flush_meta_data()
store.convert_relations('Location', 'my_external_relation', 'Location',
                        'cwuri', 'cwuri')
store.cleanup()

在大量存储失败后还原数据库

大规模存储删除了一些约束和索引 在清除调用期间自动重建。如果有错误 在导入过程中,您仍然可以调用 方法,甚至在失败后重新创建另一个存储并调用 清理 此存储的方法。

大型商店创建以下表格供内部使用:

  • dataio_initialized :有关初始化的etype/rtype表的信息。
  • dataio_constraints :可用于还原约束/索引的查询 对于不同的etype/rtype表。
  • dataio_meta data :已经推送元数据的etype。

从模式

从模式可用于并行使用海量存储:

  • 应该创建一个大型存储( master )。
  • 对于在 导入, 初始化表 / 初始化关系表 方法 应呼叫master 商店。
  • 可以使用从模式创建不同的从存储 属性。自动刷新元数据 属性应设置为false。
  • 每个从存储都可以在不同的线程中使用,用于创建 实体和关系,且只应调用其 flush 提交 方法。
  • master 存储应调用其 刷新元数据 清除 方法在导入结束时。

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

推荐PyPI第三方库


热门话题
Java:字符串。RTL设备语言用标志“+”格式化,数字后加符号   java GAE作为桌面应用程序(Swing)的服务提供商   java将InputStream转换为FileInputStream不适用于Apache POI   java外部Voronoi库“网格”:什么是草图和处理?   重载重写的泛型方法java   java显示组织上设置的错误。springframework。验证。jsp中的错误对象   java一些Spring模型属性没有显示在我的JSP中   java无法编译Guava 23的SimpleTimeLimiter示例   java如何更改JTree中的“根”目录名?   java如何在安卓中对相对布局产生连锁反应?   java错误:org。冬眠例外SQLGrammarException:无法提取结果集,dateAccessed是未知列   如何使用java监听JSON文件更新   由抽象封闭类创建的匿名内部类能否通过反射确定实现类?