问题 存储大DNA序列的最有效方法?


我想用iOS应用程序打包一个巨大的DNA序列(大约3,000,000,000个碱基对)。每个碱基对都可以有一个值 ACT 要么 G。将每个碱基对存储在一个字节中会产生3 GB的文件,这太过分了。 :)

现在我将每个碱基对存储在两位(每个八位字节四个碱基对)中,这样就得到了750 MB的文件。即使压缩,750 MB仍然太多了。

有没有更好的文件格式可以有效地在磁盘上存储巨型碱基对?内存不是问题,因为我读了块。


12553
2018-06-27 13:50


起源

我认为每个核苷酸2位+压缩是你能做的最好的。您可以尝试使用不同的压缩算法来测试哪些压缩算法具有最佳压缩率 - Timo
您应该使用压缩算法,例如,查找重复自己的序列并创建一个库,这将给他们一个ID,而不是编写整个序列,您只需要ID,应用程序必须知道如何解码,虽然功耗更大,但可以节省一些内存。 - Omer
无论你想做什么都很可能是不可能的。您需要对数据进行分段,使用服务器处理和/或流式传输数据。但蒂莫是对的。 - user120242
当你说你“大块阅读”时,你的意思是什么?我想你会想要使用某种类型的流压缩。或者你可以随时压缩块。就像是 code.google.com/p/dna-compress 或CTW-LZ流编码。 - user120242
具有“读取块”的@ user120242意味着我以例如块的形式从磁盘流传输数据。 64个八位字节并解析。应用程序只会在需要时加载更多的块,并在不再需要时从内存中释放更多块。这是因为我想向用户展示它们,但是你不能同时在如此小的屏幕上安装3,000,000,000个碱基对。


答案:


我认为你必须使用每个碱基对两位,加上实现压缩,如中所述 这张纸

“DNA序列......不是随机的;它们包含 重复切片,回文和其他功能 可以用比拼写所需的更少的比特来表示 完整的二进制序列...

使用所提出的算法,序列将被压缩75% 不论重复次数或非重复次数 序列中的模式。“

基于哈希的数据结构的DNA压缩,国际信息技术和知识管理杂志 2010年7月至12月,第2卷,第2期,第383-386页。

编辑:有一个名为GenCompress的程序声称能有效地压缩DNA序列:

http://www1.spms.ntu.edu.sg/~chenxin/GenCompress/

编辑:另见 这个问题 在BioStar上。


10
2018-06-27 14:00



我阅读了论文(对角线),如果我理解正确,他们只是将4个字母的块编码(哈希)作为单独的字母。它可以在数据库中很有用,因为您可以更好地索引序列。但是在这种情况下,使用2位而不是8位可以获得完全相同的胜利。此外,如果您对此2位令牌序列应用一些基本压缩算法,您应该获得比本文中描述的更好的结果。 - Timo
@Timo:来自论文:“DNA序列的压缩被认为是数据压缩领域最具挑战性的任务之一......标准压缩算法无法压缩DNA序列。” - Luke Girvin
@Luke Girvin。同样来自论文:“标准文本压缩算法不能压缩DNA序列......”,嗯,这不完全正确。难以压缩随机数据,而DNA序列则不然。无论如何,我只想指出它们的算法似乎在8位char值上运行,并且它们的过程在数据库服务器中实现。对于iPhone应用程序,简单地使用2位而不是8位将获得类似的胜利。如果我误解了论文,我很抱歉。 - Timo
如果GenCompress开源?我似乎无法找到源代码。
DNAC压缩是开源的: monod.uwaterloo.ca/downloads/dnacompress 它是java所以你必须移植它。 - user120242


如果您不介意使用复杂的解决方案,请查看 这张纸 要么 这张纸 甚至 这一个更详细

但我认为您需要更好地指定您正在处理的内容。某些特定应用程序可能导致不同的存储。例如,我引用的最后一篇论文涉及DNA的有损压缩......


2
2018-06-27 14:10





碱基对总是  所以你应该只存储钢绞线的一侧。现在,我怀疑如果DNA中存在某些突变(如二硫胺键)会导致相反的链与储存的链完全相反,这是有效的。除此之外,我不认为除了以某种方式压缩它之外你还有很多选择。但是,再一次,我不是生物信息学家,所以可能有一些非常复杂的方法可以在一个狭小的空间中存储一堆DNA。另一个想法,如果它是一个iOS应用程序只是将读者放在设备上并从Web服务读取序列。


1
2018-06-27 13:58



当然,我只存储了一对底座,但这仍然可以存放3,000,000件商品。


使用参考基因​​组的差异。根据您发布的大小(3Gbp),您似乎想要包含完整的人类序列。由于序列在人与人之间没有太大差异,因此您应该能够通过仅存储差异来大量压缩。

可以帮到很多。除非您的目标是存储参考序列本身。然后你就被困住了。


1
2018-06-13 21:32





考虑一下,你能得到多少种不同的组合?满分4分(我认为大约16分)

actg = 1 atcg = 2 atgc = 3,等等

你可以创建一个像[1,2,3]这样的数组,然后你可以更进一步,

检查1是否跟随2,将12转换为a,13 = b等等...... 如果我理解DNA有点意味着你无法获得某种价值

作为必须与c匹配,t与g或类似的东西,以减少您的选择, 所以基本上你可以寻找一个序列并给它一些你也可以转换回来的东西......


0
2018-06-27 13:59





您想要查看三维空间填充曲线。 3d sfc将3d复杂度降低到1d复杂度。它有点像n八叉树或r树。如果你可以将完整的dna存储在sfc中,你可以在树中查找类似的图块,尽管sfc最有可能用于有损压缩。如果您知道瓷砖的大小,然后尝试像霍夫曼压缩或哥伦布代码那样的熵压缩,也许您可​​以使用像bwt这样的块排序算法?


0
2018-06-27 16:52





你可以使用像MFCompress,Deliminate,Comrad这样的工具。这些工具提供的熵小于2.用于存储每个符号需要少于2位


0
2017-09-19 09:51