MSnbase 2.22.0
在这个小插曲中,我们将记录的各种时间和基准MSnbase版本2,它关注的是磁盘上数据访问(相对于内存中).关于新实现的更多细节在各自的类手册页和
MSnbase
,高效和优雅的基于r的处理和可视化的原始质谱数据.洛朗·盖托,塞巴斯蒂安·吉布,约翰内斯·雷纳。bioRxiv 2020.04.29.067868;doi:https://doi.org/10.1101/2020.04.29.067868
作为基准数据集,我们将使用LTQ Orbitrap Velos上获得的TMT 6-plex实验的子集,它与msdata包
- msdata::proteomics(full.names = TRUE, pattern = "TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML.gz")
# #[1]“TMT_Erwinia_1uLSike_Top10HCD_isol2_45stepped_60min_01.mzML.gz”
我们需要装MSnbase打包并将会话范围的冗长标记设置为假
.
库(MSnbase) setMSnbaseVerbose(假)
我们首先使用原始行为读取数据readMSData
函数通过设置模式
参数“inMemory”
生成ms2级原始数据的内存表示,并测量该操作所需的时间。
系统。时间(inmem <- readMSData(f, msLevel = 2, mode = "inMemory", centroided = TRUE))
##用户系统运行## 5.592 0.271 5.857
接下来,我们使用readMSData
函数来生成相同数据的磁盘表示模式= " onDisk "
.
系统。time(ondisk <- readMSData(f, msLevel = 2, mode = " ondisk ", centroided = TRUE))
##用户系统运行## 1.673 0.120 1.786
在磁盘上创建实验要快得多,而且可以扩展到更大的、多文件的数据,就对象创建时间和对象大小而言都是如此(见下一节)。当然,我们必须确保这两个数据集是等价的:
所有人。平等(inmem ondisk)
# # [1]
要比较这两个对象在内存中占用的大小,我们将使用object_size
函数的pryr包,其中占数据(光谱)在assayData
环境(相对于object.size
函数的跑龙套
包)。
库(pryr) object_size (inmem)
# # 2768208 B
object_size (ondisk)
# # 238248 B
这种差异可以用for这个事实来解释ondisk
,光谱不被创建并存储在内存中;它们在需要时访问磁盘,例如绘图:
plot(inmem[[200]], full = TRUE)
磁盘上表示的缺点是频谱数据必须实际访问。为了比较访问时间,我们将使用微基准测试并重复访问10次,以比较访问所有451和内存中的单个频谱(即预加载和构造的)和磁盘上的(即动态访问)。
Library ("microbenchmark") MB <- microbenchmark(spectra(inmem), inmem[[200]], spectra(ondisk), ondisk[[200]], times = 10) MB
##单位:microseconds ## expr min lq平均中位uq #光谱(inmem) 75.329 75.775 375.2528 199.7685 437.467 ## inmem[[200]] 26.668 29.897 70.0799 82.8100 87.235 #光谱(ondisk) 430360.994 439915.567 446851.1825 447020.1265 453917.473 ## ondisk[[200]] 238740.755 241569.416 251627.4625 246778.2525 255696.181 # max neval cld ## 1666.95 10 a ## 108.94 10 a ## 463362.69 10 c# # 293274.71 10 b
虽然与预先生成的光谱相比,动态访问数据需要花费更多的时间,但访问所有光谱只比访问所有光谱稍慢,因为大部分时间都花在准备访问文件上,而这只需要一次。
磁盘上的访问性能将取决于磁盘的读吞吐量。从内部固态驱动器和从连接USB3的硬盘导入上述文件的数据的比较显示只有很小的差异onDisk
模式(1.07vs1.36秒),而在访问单个或所有光谱时没有观察到差异。因此,对于这种特定的设置,SSD和HDD的性能基本相同。然而,这可能不适用于从多个文件并行执行数据导入的设置。
数据访问不禁止交互使用,例如绘图,因为它大约需要1/2秒,这是一个相对罕见的操作,相比之下,对磁盘上的数据进行分组和过滤更快:
I <- sample(length(inmem), 100) system.time(inmem[I])
##用户系统运行## 0.104 0.000 0.103
system.time (ondisk[我])
##用户系统运行## 0.012 0.001 0.012
对光谱数据的操作,如峰的选择,平滑,清洁,…被巧妙地缓存,只在数据被访问时应用,以最小化文件访问开销。最后,特定的操作,例如定量(见下一节),会根据速度进行优化。
下面,我们对前100个光谱进行TMT 6-plex报告离子定量,并验证结果相同(忽略特征名称)。
系统。时间(eim <- quantify(inmem[1:100], reports = TMT6, method = "max"))
##用户系统运行## 4.637 0.459 1.466
系统。time(eod <- quantify(ondisk[1:100], reports = TMT6, method = "max"))
##用户系统运行## 0.310 0.137 0.403
所有人。等于(eim爆炸品处理,检查。属性= FALSE)
# # [1]
的MSnExp
而且OnDiskMSnExp
文档文件和MSnbase发展Vignette提供了更多关于实现细节的信息。
磁盘上在一个对象中支持多个MS级别,而内存中只支持单个级别。虽然可以将对多个MS级别的支持添加到内存中的后端,但内存限制使这几乎毫无用处,而且很可能永远不会发生。
内存中对象可以save ()
埃德和load ()
艾德,而磁盘上不能。作为一种变通办法,后者可以被强制内存中与实例(,“MSnExp”)
.我们需要mzML
写的支持mzR以便能够实现序列化磁盘上数据。
只要可能,访问和处理磁盘上数据延迟(懒惰的处理)。这些操作存储在处理队列直到光谱被有效地实例化。
的磁盘上validObject
方法不能验证光谱的有效性(因为没有任何光谱可以检查)。的validateOnDiskMSnExp
函数,另一方面,实例化所有的光谱并检查它们的有效性(除了调用validObject
).
本文档主要关注新磁盘上的速度和大小改进MSnExp
表示。对于更大的数据,这些改进的范围将大大增加。
关于磁盘上的一般功能MSnExp
数据类和MSnbase一般来说,请参阅可用的其他小插图
装饰图案(包=“MSnbase”)