gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:28:51 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com