为DNA声明一种新的数据类型

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

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

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

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

此外,这会在其他语言(可能更高级别像Java)中更好地工作吗?

难道你不能把两个ATGC集合成一个字节吗? 喜欢:

0 1 0 1 1 0 0 1 ATGCATGC 

那么这一个字节代表TC,AC?

如果你想使用Java,你将不得不放弃对大事情的控制。 你可以去的最小的AFAIK是byte原语,它是8位(-128到127)。

虽然我认为这是有争议的,但似乎Java更适合广泛的系统控制,而不是快速,有效的细节工作,例如你通常用C做的。

如果不要求您同时将整个数据集保存在内存中,您甚至可以尝试使用像MySQL这样的托管数据库来存储基本信息,然后逐个读取。

如果我要写一个类似的代码,我会将核苷酸标识符存储在一个字节中,您可以在其中添加1,2,3,4作为A,T,G,C的值。 即使你会考虑使用RNA,你也可以添加第5个元素,U值为5。如果你真的正在深入研究这个项目,我会建议为密码子编写一个类。 在这个类中,您可以指定它是内含子/外显子,起始密码子还是终止密码子等。 最重要的是,你可以制作一个基因类,你可以在其中指定启动子区域等。

如果你有大量的dna,rna序列,它需要大量的计算,而不是我强烈建议使用C ++和科学计算Fortrain。 (总人类基因组是1.4 Gb)

同样因为有很多重复的序列,将基因组构成密码子是有用的,这样你就可以节省大量的内存(你只需要对一个密码子类进行参考,而不必构建N次类)。

你也可以预先定义你的类,并且只有64个,所以你的整个genom只是一个有序的引用列表。 因此,在我看来,将密码子作为基本单位的效率要高得多。

以下链接是我的研究论文之一Checkout,如果您发现它对您有用,请告诉我您是否需要有关实施的更多详细信息。

GenCodeX – Kaliuday Balleda

尝试char数据类型。

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

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

请查看此内容以获取更多详细信息

问题不仅在于哪种数据类型将保持最小值,而且还有什么是访问位级内存的最有效方法。

由于我的知识有限,我可能会尝试设置一个位数组(根据我的理解,这是访问位数存储器的最有效方法;我可能在我的理解中有误,但是如果存在相同的原则则适用是一个更好的),然后使用逐位运算符写/读。

下面是一些部分代码,可以让您了解如何继续进行2位定义和大量整数。 假设指针(a)设置为大量的int:

 unsinged int *a, dna[large number]; a = dna; *a = 0; 

设置位定义:

为一个:

 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位。 有关数组大小的最大值,请参阅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