python - 对于 2Gb 文本文件,搁置字典大小 >100Gb

标签 python out-of-memory bioinformatics shelve

我正在从基因组 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/

相关文章:

python - server.send(join.encode ('utf-8' )) 给了我这个错误

python - 我应该如何使用 Spark 在 s3 上加载文件?

java OOM 关于创建 2 个 10 亿个整数的数组

java - 无法写入超出特定大小的 DataOutputStream - OutOfMemoryError

python - 如何加速400万组路口?

linux - 在 Linux 中计算磁盘峰值大小

python - numpy 的内存错误在哪里

python - Kivy 标签文本淡入

java - 捕获内存不足错误之前的最后一个进程

pythonic相当于R GRanges中的reduce() - 如何折叠范围数据?