我参与了生物学,特别是DNA,并且通常对基因组测序数据的大小存在问题。
对于那些没有生物学背景的人,我将快速概述DNA测序。 DNA由四个字母组成:A,T,G和C,其特定顺序决定细胞中发生的情况。
然而,DNA测序技术的一个主要问题是产生的数据大小(对于整个基因组,通常远远超过千兆字节)。
我知道C中int的大小因计算机而异,但它仍有比四种选择更多的信息存储可能性。有没有办法定义一种类型/方式来定义一个基础'只占用2位或3位?我已经搜索过定义一个结构,但我担心这不是我想要的。谢谢。
此外,这会在其他语言中更好用(可能更高级别,如java)吗?
答案 0 :(得分:2)
那么你不能把两个ATGC集合成一个字节吗?像:
0 1 0 1 1 0 0 1
A T G C A T G C
所以这一个字节代表TC,AC?
答案 1 :(得分:1)
如果你想使用Java,你将不得不放弃对大事情的控制。你可以去的最小的AFAIK是byte
原语,它是8位(-128到127)。
虽然我认为这是值得商榷的,但似乎Java更适合广泛的系统控制而不是快速,有效的细节工作,例如你通常用C做的。
如果没有要求您一次将整个数据集保存在内存中,您甚至可以尝试使用像MySQL这样的托管数据库来存储基本信息,然后逐个读取。
答案 2 :(得分:1)
如果我要写一个类似的代码,我会将核苷酸标识符存储在一个字节中,您可以在其中添加1,2,3,4作为A,T,G,C的值。即使你会考虑使用RNA,你也可以添加第5个元素,其值为5。 如果你真的正在深入研究这个项目,我会建议你为密码子做一个课程。在这个类中,您可以指定它是内含子/外显子,起始密码子还是终止密码子等。除此之外,您还可以制作基因类,您可以在其中指定启动子区域等。
如果你有大量的dna,rna序列,它需要大量的计算,而不是我强烈建议使用C ++和科学计算Fortrain。 (总人类基因组是1.4 Gb)
同样因为有很多重复的序列,将基因组构成密码子是有用的,这样你就可以节省大量的内存(你只需要对一个密码子类进行参考,而不必构建N次类) )。
同样结构化密码子,你可以预定义你的类,并且只有64个,所以你的整个基因组只是一个有序的引用列表。因此,在我看来,将密码子作为基本单位会更有效率。
答案 3 :(得分:1)
以下链接是我的研究论文之一Checkout,如果您发现它对您有用,请告诉我是否需要更多有关实施的详细信息。
答案 4 :(得分:0)
答案 5 :(得分:0)
问题不仅在于哪种数据类型保持最小值,而且还有什么是访问位级内存的最有效方法。
由于我的知识有限,我可能会尝试设置一个位数组(根据我的理解,这是访问位数存储器的最有效方法;我的理解可能会错误,但原理相同如果有更好的应用,则应用),然后使用逐位运算符进行写/读。
以下是一些部分代码,可以让您了解如何继续进行2位定义和大量的int。 假设指针(a)设置为大量的int:
unsinged int *a, dna[large number];
a = dna;
*a = 0;
设置位定义:
对于A:
da = 0;
da = ~da;
da = da << 2;
da = ~da; (11)
对于G:
dg = 0;
dg = ~dg;
dg = dg << 1;
dg = ~dg;
dg = dg << 1; (10);
依此类推T和C
对于循环:
while ((b = getchar())!=EOF){
i = sizeof(int)*8; /*bytes into bits*/
if (i-= 2 > 0){ /*keeping track of how much unused memory is left in int*/
if (b =='a' || b == 'A')
*a = *a | da;
else if (b == 't' || b == 'T')
*a = *a | ta;
else if (t...
else if (g...
else
error;
*a = *a << 2;
} else{
*++a = 0; /*advance to next 32-bit set*/
i = sizeof(int)*8 /* it may be more efficient to set this value aside earlier, I don't honestly know enough to know this yet*/
if (b == 'a'...
else if (b == 't'...
...
else
error;
*a = *a <<2;
}
}
等等。这将为每个int(或16个字母)存储32位。有关数组大小的最大值,请参阅The maximum size of an array in C。
我只是从新手C的角度讲。我认为机器语言可以更好地满足您的要求,尽管我确信那里有高级解决方案。我知道FORTRAN在科学方面是一个备受推崇的,但我知道它是由于它的计算速度,不一定是因为它有效的存储(尽管我确定它不是缺乏那里);这里有一个有趣的读物:http://arstechnica.com/science/2014/05/scientific-computings-future-can-any-coding-language-top-a-1950s-behemoth/。我也会考虑压缩,但遗憾的是我自己也没有学到很多东西。
我在调查位数时转向的源代码: http://www.mathcs.emory.edu/~cheung/Courses/255/Syllabus/1-C-intro/bit-array.html