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