问题:
我有昂贵的(几小时到几天计算)和大(GB)数据属性,通常构建为一个或多个其他数据属性的转换.我需要跟踪这些数据的确切构建方式,以便我可以将其重新用作另一个转换的输入,如果它符合问题(使用正确的规范值构建)或根据需要构建新数据.虽然它无关紧要,但我通常从“增值”有点异质的分子生物学信息开始,例如,基因和蛋白质的基因组由其他研究人员通过其他过程注释.我需要结合并比较这些数据来做出我自己的推论.通常需要许多中间步骤,并且这些步骤可能很昂贵.此外,最终结果可以成为其他转换的输入.所有这些转换都可以通过多种方式完成:使用不同的初始数据进行限制(例如使用不同的生物),在相同的推论中使用不同的参数值,或者使用不同的推理模型等.分析经常变化并在其他基础上构建以无计划的方式.我需要知道我有什么数据(什么参数或规格完全定义它),所以我可以在适当的时候重复使用它,以及一般的科学完整性.
我的努力一般:
我设计我的python类时考虑到描述问题.由类对象构建的所有数据属性由一组参数值描述.我将这些定义参数或规范称为’def_specs’,这些def_specs的值为数据atts的’shape’.进程的整个全局参数状态可能非常大(例如,一百个参数),但是任何一个类提供的数据att仅需要少量这些,至少直接.目标是通过测试其形状是否为全局参数状态的子集来检查先前构建的数据是否合适.
在一个类中,通过检查代码很容易找到定义形状所需的def_spec.当模块需要来自另一个模块的数据时,就会产生摩擦.这些数据将具有自己的形状,可能由调用对象作为args传递,但更经常从全局参数状态过滤掉.应该使用其依赖关系的形状来扩充调用类,以便维护其数据的完整描述.
从理论上讲,这可以通过检查依赖图来手动完成,但是这个图可以深入,并且有许多模块,我不断改变和添加,并且……我太懒惰而且不小心手工完成.
因此,程序通过跟踪对其他类属性的调用并通过托管的__get__调用堆栈将其形状反馈给调用者,从而动态发现数据atts的完整形状.当我重写时,我发现我需要严格控制对构建器类的属性访问,以防止任意信息影响数据.幸运的是,python使用描述符使这很容易.
我将数据的形状存储在数据库中,以便我可以查询是否已存在适当的数据(即其形状是当前参数状态的子集).在我的重写中,我将从MysqL通过伟大的sqlAlchemy转移到对象db(ZODB或couchdb?),因为当发现额外的def_spec时,每个类的表必须被更改,这是一个痛苦,并且因为一些def_spec是python列表或dicts,这是一个很难转换为sql.
我不认为这个数据管理可以与我的数据转换代码分开,因为需要严格的属性控制,尽管我尽可能地尝试这样做.我可以使用现有的类,通过将它们包装为提供def_specs作为类属性的类,以及通过描述符进行数据库管理,但这些类是终端的,因为不能进一步发现其他依赖形状.
如果数据管理不能轻易地与数据结构分离,我想不太可能有开箱即用的解决方案,而是一千个特定的解决方案.也许有适用的模式?我很欣赏任何有关如何寻找或更好地描述问题的提示.对我来说,这似乎是一个普遍的问题,尽管管理深层次的数据可能与网络的盛行风不一致.