2014-11-23 10 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 है, लेकिन जब मैं कोशिश करते हैं और यह स्थगित, > 100 जीबी की एक फाइल का उत्पादन किया जा रहा है, साथ ही मेरा कंप्यूटर मेमोरी से बाहर होने और स्टार्ट अप डिस्क भरने के बारे में कई शिकायतें फेंक देगा। ऐसा लगता है कि जब मैं ओएसएक्स योसामेट के तहत इसे चलाने की कोशिश करता हूं, उबंटू पर यह अपेक्षा के अनुसार काम करता है। कोई सुझाव क्यों यह काम नहीं कर रहा है? मैं पाइथन 3.4.2

+0

आप किस पायथन संस्करण का उपयोग करते हैं? – Daniel

+0

@ डैनियल पायथन 3.4.2 – jma1991

+0

इस से संबंधित हो सकता है? http://stackoverflow.com/questions/26574954/virtualenv-fails-on-os-x-yosemite-with-oserror – Ashalynd

उत्तर

2

सत्यापित करें कि import dbm; print(dbm.whichdb('your_file.db') द्वारा डीबीएम के लिए इंटरफ़ेस का उपयोग किस प्रकार किया जाता है सत्यापित करें शेल्व द्वारा उपयोग किया गया फ़ाइल प्रारूप आपके सिस्टम और उसके इंटरफेस पर उपलब्ध सर्वोत्तम स्थापित बाइनरी पैकेज पर निर्भर करता है। नवीनतम 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() 

यह ज्ञात है कि डी बी एम डेटाबेस यदि अनुप्रयोग डेटाबेस close बुला बिना अपडेट के बाद नीचे गिर गया खंडित हो गया। मुझे लगता है कि यह तुम्हारा मामला था। अब आपके पास बड़ी फ़ाइल में अभी तक कोई महत्वपूर्ण डेटा नहीं है, लेकिन भविष्य में आप gdbm.reorganize() द्वारा डेटाबेस को डिफ्रैगमेंट कर सकते हैं।

0

मुझे एक ही समस्या थी: डिस्क पर लगभग 4 मेगाबाइट डेटा के साथ एक शेल्फ के साथ एक मैकोज़ सिस्टम पर डिस्क पर 2 9 गीगाबाइट के विशाल आकार में वृद्धि हुई! यह स्पष्ट रूप से हुआ क्योंकि मैंने शेल्व में एक ही महत्वपूर्ण मूल्य जोड़े को बार-बार अपडेट किया था।

जैसा कि मेरा शेल्व जीएनयू डीबीएम पर आधारित था, मैं पुनर्गठन के बारे में अपने संकेत का उपयोग करने में सक्षम था।

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

मैं यकीन नहीं है कि इस तकनीक को अन्य (गैर जीएनयू) के लिए काम करेंगे नहीं कर रहा हूँ के रूप में अच्छी तरह से डीबीएमएस: यहाँ कोड है कि सेकंड के भीतर सामान्य आकार में वापस मेरी टांड़ फ़ाइल लाया है। अपने dbm प्रणाली का परीक्षण करने के लिए, @hynekcer द्वारा दिखाए गए कोड याद रखें: जीएनयू dbm आपके सिस्टम इस करना चाहिए उत्पादन 'dbm.gnu' (जो बड़े gdbm का नया नाम है) द्वारा किया जाता है

import dbm 
print(dbm.whichdb(shelfFileName)) 

हैं।

संबंधित मुद्दे