我正在从基因组 FASTA 文件创建一个搁置序列文件:
# Import necessary libraries
import shelve
from Bio import SeqIO
# Create dictionary of genomic sequences
genome = {}
with open("Mus_musculus.GRCm38.dna.primary_assembly.fa") as handle:
for record in SeqIO.parse(handle, "fasta"):
genome[str(record.id)] = str(record.seq)
# Shelve genome sequences
myShelve = shelve.open("Mus_musculus.GRCm38.dna.primary_assembly.db")
myShelve.update(genome)
myShelve.close()
文件本身是 2.6Gb,但是当我尝试搁置它时,正在生成一个 >100Gb 的文件,而且我的计算机会发出一些关于内存不足和启动磁盘已满的提示。这似乎只发生在我尝试在 OSX Yosemite 下运行它时,在 Ubuntu 上它按预期工作。为什么这不起作用的任何建议?我正在使用 Python 3.4.2
最佳答案
通过import dbm验证dbm使用的是什么接口(interface); print(dbm.whichdb('your_file.db')
shelve 使用的文件格式取决于系统及其接口(interface)上可用的最佳安装二进制包。最新的是 gdbm
,而如果没有找到二进制文件,dumb
是一个后备解决方案,ndbm
介于两者之间。
https://docs.python.org/3/library/shelve.html
https://docs.python.org/3/library/dbm.html
如果你失去了文件系统缓存的所有内存,那么将所有数据都放在内存中是不利的。按较小的 block 更新更好。如果一项一项地更新,我什至看不到速度变慢。
myShelve = shelve.open("Mus_musculus.GRCm38.dna.primary_assembly.db")
with open("Mus_musculus.GRCm38.dna.primary_assembly.fa") as handle:
for i, record in enumerate(SeqIO.parse(handle, "fasta")):
myShelve.update([(str(record.id), str(record.seq))])
myShelve.close()
众所周知,如果应用程序在更新后没有调用数据库 close
就崩溃了,dbm 数据库就会变得碎片化。我认为这是你的情况。现在您的大文件中可能还没有重要数据,但将来您可以通过 gdbm.reorganize()
对数据库进行碎片整理。
关于python - 对于 2Gb 文本文件,搁置字典大小 >100Gb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27088991/