- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 scikit-bio 读取 fastq 格式的文本文件.
鉴于它是一个相当大的文件,执行操作非常慢。
最终,我试图将 fastq 文件去复制到字典中:
f = 'Undetermined_S0_L001_I1_001.fastq'
seqs = skbio.io.read(f, format='fastq')
seq_dic = {}
for seq in seqs:
seq = str(seq)
if seq in seq_dic.keys():
seq_dic[seq] +=1
else:
seq_dic[seq] = 1
这里大部分时间都用在读取文件的过程中:
%%time
f = 'Undetermined_S0_L001_I1_001.fastq'
seqs = skbio.io.read(f, format='fastq')
for seq in itertools.islice(seqs, 100000):
seq
CPU times: user 46.2 s, sys: 334 ms, total: 46.5 s
Wall time: 47.8 s
我的理解是不验证序列会提高运行时间,但事实并非如此:
%%time
f = 'Undetermined_S0_L001_I1_001.fastq'
seqs = skbio.io.read(f, format='fastq', verify=False, variant='illumina1.8')
for seq in itertools.islice(seqs, 100000):
seq
CPU times: user 47 s, sys: 369 ms, total: 47.4 s
Wall time: 48.9 s
所以我的问题是,首先,为什么 verify=False
不能提高运行时间,其次,是否有使用 scikit-bio 读取序列的更快方法?
最佳答案
first why isn't verify=False improving run time
verify=False
是 scikit-bio 的 I/O API 通常接受的参数。它不特定于特定的文件格式。 verify=False
告诉 scikit-bio 不要调用文件格式的嗅探器来仔细检查文件是否为用户指定的格式。来自文档 [1]:
verify : bool, optional
When True, will double check the format if provided.
因此 verify=False
不会关闭序列数据验证;它关闭文件格式嗅探器验证。使用 verify=False
,您将获得最小的性能提升。
seqs = skbio.io.read(f, format='fastq', verify=False, variant='illumina1.8')
将生成一个 skbio.Sequence
对象。不执行序列字母表验证,因为 skbio.Sequence
没有字母表,所以这不是您的性能瓶颈所在。请注意,如果您想将 FASTQ 文件读入特定类型的生物序列(DNA、RNA 或蛋白质),您可以传递 constructor=skbio.DNA
(例如)。这将对相关序列类型执行字母表验证,目前无法在阅读时关闭。由于您遇到性能问题,我不建议传递 constructor
,因为这只会进一步降低速度。
and second is there a faster way using scikit-bio to read sequences?
没有比使用 scikit-bio 读取 FASTQ 文件更快的方法了。有一个问题 [2] 探索可以加快速度的想法,但这些想法尚未实现。
scikit-bio 在读取 FASTQ 文件时速度较慢,因为它支持读取可能跨越多行的序列数据和质量分数。这会使读取逻辑复杂化并且会影响性能。然而,具有多行数据的 FASTQ 文件不再常见; Illumina 过去常常生成这些文件,但他们现在更喜欢/推荐编写恰好四行的 FASTQ 记录(序列标题、序列数据、质量标题、质量分数)。事实上,这就是 scikit-bio 写入 FASTQ 数据的方式。使用这种更简单的记录格式,可以更快更轻松地读取 FASTQ 文件。 scikit-bio 在读取 FASTQ 文件时也很慢,因为它解码并验证质量分数。它还将序列数据和质量分数存储在 skbio.Sequence
对象中,这会产生性能开销。
在您的情况下,您不需要解码质量分数,并且您可能有一个包含简单四行记录的 FASTQ 文件。这是一个 Python 3 兼容的生成器,它读取 FASTQ 文件并将序列数据生成为 Python 字符串:
import itertools
def read_fastq_seqs(filepath):
with open(filepath, 'r') as fh:
for seq_header, seq, qual_header, qual in itertools.zip_longest(*[fh] * 4):
if any(line is None for line in (seq_header, seq, qual_header, qual)):
raise Exception(
"Number of lines in FASTQ file must be multiple of four "
"(i.e., each record must be exactly four lines long).")
if not seq_header.startswith('@'):
raise Exception("Invalid FASTQ sequence header: %r" % seq_header)
if qual_header != '+\n':
raise Exception("Invalid FASTQ quality header: %r" % qual_header)
if qual == '\n':
raise Exception("FASTQ record is missing quality scores.")
yield seq.rstrip('\n')
如果您确定您的文件是包含恰好四行长的记录的有效 FASTQ 文件,则可以在此处删除验证检查。
这与您的问题无关,但我想指出您的计数器逻辑中可能存在错误。当你第一次看到一个序列时,你的计数器设置为零而不是 1。我认为逻辑应该是:
if seq in seq_dic: # calling .keys() is necessary
seq_dic[seq] +=1
else:
seq_dic[seq] = 1
[1] http://scikit-bio.org/docs/latest/generated/skbio.io.registry.read.html
关于python-3.x - 使用 scikit-bio 阅读 fastq 的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39150965/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!