声明DNA的新数据类型

时间:2014-06-25 03:16:49

标签: java c

我参与了生物学,特别是DNA,并且通常对基因组测序数据的大小存在问题。

对于那些没有生物学背景的人,我将快速概述DNA测序。 DNA由四个字母组成:A,T,G和C,其特定顺序决定细胞中发生的情况。

然而,DNA测序技术的一个主要问题是产生的数据大小(对于整个基因组,通常远远超过千兆字节)。

我知道C中int的大小因计算机而异,但它仍有比四种选择更多的信息存储可能性。有没有办法定义一种类型/方式来定义一个基础'只占用2位或3位?我已经搜索过定义一个结构,但我担心这不是我想要的。谢谢。

此外,这会在其他语言中更好用(可能更高级别,如java)吗?

6 个答案:

答案 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,如果您发现它对您有用,请告诉我是否需要更多有关实施的详细信息。

GenCodeX - Kaliuday Balleda

答案 4 :(得分:0)

尝试char数据类型。

它们通常是C \ C ++中最小的可寻址内存单元。我使用的大多数系统都是1字节。

你不能使用一两位的原因是因为CPU已经在吸收额外的数据。

请查看this了解详情

答案 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