我有一个非常大的序列,我以字符串的形式读入(250000000个字母)。字母是G,A,C,T
例如:
'GACTCGTAGCTAGCTG'
我想创建一些方法来存储序列中每个3个字母子字符串的索引,以便稍后在另一个函数中使用
例如:
{'GAC': 1, 'ACT': 2 'CTC':3, 'TCG':4 ...}
对于我目前的方法,我的问题是我没有找到一种有效的方法来存储序列中每个3个字母子字符串的索引。一旦我知道每个子串的索引,我将根据给定的概率随机选择其中的一些,并将它们更改为另一个已知的子串
我尝试过使用for循环迭代,在滑动窗口中一次使用一个3个字母的子字符串,并将位置保存为字典值,使用3个字母的子字符串作为键。另外,当我保存这个字典文件时,我一直在使用pd.to_csv,但它似乎效率很低,并且创建了一个8 GB的文件。但是,对于一个非常大的字符串(250000000个字母),这需要太长的时间
可以将长字符串拆分为3个字母的子字符串:
substrings
将是:将这些标记添加到另一个列表:
这只会产生:
子字符串列表中的第n个元素将对应于索引列表中的第n个元素
有关如何将文件放入字符串变量,请参见: How to read a text file into a string variable and strip newlines?
您的示例输出表明,每个子序列只需要一个索引,但您的描述暗示您可能需要所有索引
下面是一个函数,该函数将为存在的子序列(给定长度)构建一个包含所有索引的字典:
如果您确实只需要每个3个字母子序列的第一个索引,则使用单个词典理解可以更快地获取词典:
我对2.5亿个字母的随机序列进行了性能测试,单索引字典可以在几微秒内获得。获取所有索引需要一分钟多一点(使用上述函数):
输出:
考虑到加载序列的时间比构建索引的时间要长得多,您可以放弃存储索引字典,每次都从源数据重新构建它(您似乎仍然需要为您的过程加载源数据)
您还可以存储计数字典,并根据需要提取索引:
此函数用于获取每个子序列的出现次数:
它与sequenceDict函数的运行时间大致相同,但生成的字典要小得多
要获取特定子序列(包括重叠位置)的索引,可以使用以下方法:
如果您不需要立即为所有子序列创建所有索引,那么您可以相应地构造代码,只在需要时获取索引(并可能将它们存储在字典中以便查询和重用)
相关问题 更多 >
编程相关推荐