根据规格值管理科学数据依赖图的Python解决方案
我遇到了一个科学数据管理的问题,这个问题看起来很普遍,但我找不到现成的解决方案,甚至连描述都没有,这让我困惑了很久。我准备开始一个大规模的重写(用Python),但我想最后再看看有没有现成的解决方案,这样我就可以放弃自己的方案,回到生物学的研究上,或者至少学一些合适的术语,以便更好地搜索。
问题是: 我有一些计算起来很耗时(可能需要几个小时到几天)且数据量很大的属性(通常是GB级别),这些属性通常是通过对一个或多个其他数据属性进行转换而得到的。我需要准确记录这些数据是如何构建的,这样如果适合问题(使用了正确的规格值),我就可以将其作为输入再进行其他转换,或者根据需要构建新的数据。虽然这不一定重要,但我通常是从一些“增值”的、稍微杂乱的分子生物学信息开始,比如基因组、基因和蛋白质,这些信息是其他研究者通过其他过程注释的。我需要将这些数据结合和比较,以便得出自己的推论。通常需要经过多个中间步骤,而这些步骤可能会很耗费资源。此外,最终结果可能会成为进一步转换的输入。这些转换可以通过多种方式进行:使用不同的初始数据(例如使用不同的生物体)、在同一推论中使用不同的参数值,或者使用不同的推论模型等等。分析经常变化,并且以意想不到的方式建立在其他分析之上。我需要知道我拥有什么数据(哪些参数或规格完全定义了它),这样我才能在合适的情况下重用它,同时也为了科学的完整性。
我的总体努力: 我在设计Python类时考虑到了描述的问题。通过类对象构建的所有数据属性都由一组参数值来描述。我称这些定义参数或规格为“def_specs”,这些def_specs及其值就是数据属性的“形状”。整个过程的全局参数状态可能相当大(例如一百个参数),但任何一个类提供的数据属性只需要其中的一小部分,至少是直接需要的。目标是通过测试之前构建的数据属性的形状是否是全局参数状态的一个子集,来检查这些数据属性是否合适。
在一个类内部,通过检查代码很容易找到定义形状所需的def_specs。当一个模块需要另一个模块的数据属性时,问题就来了。这些数据属性会有自己的形状,可能是通过调用对象传递的参数,但更常见的是从全局参数状态中筛选出来。调用类应该增加其依赖项的形状,以保持对其数据属性的完整描述。 理论上,这可以通过检查依赖图手动完成,但这个图可能会很复杂,而且模块很多,我一直在不断更改和添加,... 我太懒了,不想手动去做。
因此,程序通过跟踪对其他类属性的调用,动态发现数据属性的完整形状,并通过管理的__get__
调用栈将其形状推送回调用者。在重写过程中,我发现我需要严格控制对构建类属性的访问,以防止任意信息影响数据属性。幸运的是,Python通过描述符使这变得简单。
我将数据属性的形状存储在数据库中,以便查询是否已经存在合适的数据(即其形状是当前参数状态的一个子集)。在我的重写中,我正在通过强大的SQLAlchemy从mysql迁移到对象数据库(ZODB或couchdb?),因为当发现额外的def_specs时,每个类的表必须进行更改,这很麻烦,而且因为一些def_specs是Python列表或字典,这些在转换为SQL时也很麻烦。
我认为数据管理和数据构建是无法轻易分开的,因为需要严格控制属性,尽管我尽量做到这一点。我可以通过用一个提供其def_specs作为类属性的类来包装现有类,并通过描述符进行数据库管理,但这些类是终端的,因为无法进一步发现额外的依赖形状。
如果数据管理无法轻易与数据构建分开,我想不太可能有现成的解决方案,而是有成千上万的具体解决方案。也许有适用的模式?我会很感激任何关于如何寻找或更好描述这个问题的提示。对我来说,这似乎是一个普遍的问题,尽管管理深层次的数据可能与网络的主流趋势相悖。
2 个回答
我没有特别针对Python的建议,但我有一些想法可以分享:
你遇到的这个问题在生物信息学中很常见。数据量大、种类繁多,而且随着新技术的出现,数据格式也在不断变化。我的建议是不要过于纠结于你的数据处理流程,因为这些流程可能明天就会变。选择几种明确的文件格式,然后尽量把接收到的数据转换成这些格式。根据我的经验,通常最好使用一些功能单一、相互独立的工具,这样你可以快速将它们组合起来进行不同的分析。
你也可以考虑把这个问题带到生物信息学的讨论区,网址是 http://biostar.stackexchange.com/
ZODB并不是为了处理大量数据而设计的,它主要是用于网页应用,而且它其实是一个基于平面文件的数据库。
我建议你试试PyTables,这是一个用来处理HDF5文件的Python库。HDF5是一种在天文学和物理学中常用的格式,用来存储大规模计算和模拟的结果。它可以像层级数据库一样使用,并且有一种高效的方法来保存Python对象。顺便提一下,PyTables的作者曾解释过ZODB对他来说太慢,我也可以确认这一点。如果你对HDF5感兴趣,还有另一个库h5py。
如果你想管理不同计算的版本,可以试试sumatra,它类似于git/trac,但专门为模拟设计的。
你应该在biostar上问这个问题,那里的回答会更好。