kraken2 命令有一个参数是 --memory-mapping,据我观察,该参数可能会根据参考数据库的大小和系统内存大小来选择是否将数据库读入内存。
我的电脑内存是64G,参考数据库是59G(解压后69G)的标准数据库,刚刚好能读入内存。
在运行kraken2时,如果是数据量较小的样本,该命令就会将数据库全部读入内存,然后进行序列比对。且如果后续的样本大小都差不多,就会保存数据库在缓存中,连续跑通。
但是,一旦运行过程中遇到数据量较大的样本,就会出现【运行所需内存】> 【电脑可分配内存】,之前存储的缓存又无法被释放,继续运行就会导致内存溢出从而被系统的OOM机制杀死。
有没有办法可以实现判断样本大小是否会导致内存溢出并在在运行大样本前释放缓存呢?
可以通过在运行kraken2之前,先估算样本大小和可用内存大小,来判断样本是否会导致内存溢出。如果判断样本大小会导致内存溢出,可以在运行大样本前手动释放缓存,以腾出更多内存空间。具体方法如下:
Bash free -m
该命令会输出系统可用内存的大小,以MB为单位。同时,可以通过查看kraken2的文档,来获取样本的大小和kraken2运行所需的内存大小。Bash sudo sysctl -w vm.drop_caches=3
该命令会释放文件系统缓存,以腾出更多内存空间。同时,也可以通过关闭一些运行中的程序或服务,来腾出更多内存空间。