2014-11-23 18 views
5

我從基因組FASTA文件創建序列的貨架文件:擱置字典大小是> 100Gb的一個2Gb的文本文件

# 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

+0

你使用哪個python版本? – Daniel 2014-11-23 12:42:17

+0

@Daniel Python 3.4.2 – jma1991 2014-11-23 12:43:26

+0

可能與此相關? http://stackoverflow.com/questions/26574954/virtualenv-fails-on-os-x-yosemite-with-oserror – Ashalynd 2014-11-23 15:21:58

回答

2

通過import dbm; print(dbm.whichdb('your_file.db')驗證dbm使用的接口是什麼shelve使用的文件格式取決於系統及其接口上可用的最佳安裝二進制包。最新的是gdbm,而dumb是一個後備解決方案,如果沒有找到二進制文件,則在ndbm之間。
https://docs.python.org/3/library/shelve.html
https://docs.python.org/3/library/dbm.html

,如果你失去了文件系統緩存所有的記憶,是不利於在內存中的所有數據。更小的塊更新更好。如果項目逐一更新,我甚至沒有看到放緩。

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() 

據瞭解,DBM數據庫變得支離破碎,如果應用程序更新後倒下,而無需調用數據庫close。我認爲這是你的情況。現在,您可能在大文件中沒有重要數據,但將來您可以通過gdbm.reorganize()對數據庫進行碎片整理。

0

我遇到了同樣的問題:在一臺擁有大約4兆字節數據的macOS系統上,磁盤上的大小達到29千兆字節!這顯然是因爲我一次又一次地更新擱置中的相同鍵值對。

由於我的擱置基於GNU dbm,因此我可以使用他對重組的暗示。下面是幾秒鐘內把我擱置文件恢復到正常大小的代碼:

import dbm 
db = dbm.open(shelfFileName, 'w') 
db.reorganize() 
db.close() 

我不知道這種技術是否會爲其他(非GNU)工作DBMS爲好。要測試你的DBM系統,記得@hynekcer所示的代碼:

import dbm 
print(dbm.whichdb(shelfFileName)) 

如果GNU DBM使用由系統這應該輸出「dbm.gnu」(這是老GDBM的新名稱)。

相關問題