मैट्रिक्स में गहराई से मेम-मैप धीमा हो जाता है

तो मेरे पास एक बहुत बड़ा मैट्रिक्स (120000 x 120000) है, और मैं इस संपूर्ण मैट्रिक्स पर एक स्क्रिप्ट चला रहा हूं जो तत्व को हर दूसरे तत्व से तुलना करता है। क्योंकि मैं पूरी चीज को याद में नहीं रख सकता, मैं memmap का उपयोग करता हूं। मैं समय-समय पर यह सुनिश्चित करने के लिए मैट्रिक्स को फ्लश करता हूं कि यदि कंप्यूटर क्रैश हो या कुछ मैं डेटा खो नहीं पाता हूं। हालांकि, मैंने देखा है कि "गहरा" मैं मैट्रिक्स में जाता हूं, इसलिए बोलने के लिए, डेटा बढ़ने के लिए जितना समय लगता है। आखिरकार, मेरे परिणामों को बचाने में पांच मिनट तक लगते हैं। Woudl किसी को पता है कि यह क्यों कर रहा है? क्या मैं ऐसा कर सकता हूं? मैं कुछ कोड पोस्ट करूंगा, लेकिन मैं काफी हद तक निश्चित हूं कि मैं कुछ भी गलत नहीं कर रहा हूं।

OUT_DIR = '/media/sf_3dAnalysis/simMatrix/'
SIM_FILE = 'similarity.npy'
data = np.lib.format.open_memmap(OUT_DIR+SIM_FILE, mode='w+', dtype='float32', shape=(120821,120821))
#After processing a certain amount of indices, I go to flush the data.
data.flush()
0

1 उत्तर

mmap संदर्भ के एक छोटे से इलाके के साथ समस्याओं के लिए अच्छा है - एक जो भौतिकी में फिट होगा। हालांकि, ऐसा लगता है कि आप 53 गीगाबाइट डेटा के लिए mmap का उपयोग कर रहे हैं, और संदर्भ की इलाका अच्छी नहीं है।

यदि आप mmap करने के लिए प्रतिबद्ध हैं तो आपको शायद इस वर्कलोड के लिए प्रदर्शन प्रदर्शन का थोड़ा सा स्वीकार करना होगा।

एक चीज जो कुछ में मदद कर सकती है, एक कक्षा लिख ​​रही है जो स्मृति में जितनी संभव हो सके मैट्रिक्स को रखेगी (शायद पहली पंक्तियां), और बाकी को डिस्क पर रखें (बाकी पंक्तियां) , uncached (शायद O_DIRECT का उपयोग कर)।

आपके मामले में, पूरी चीज को कैशिंग करने से शायद वर्चुअल मेमोरी थ्रैशिंग हो जाएगी जबतक कि आपके पास एक असामान्य रूप से बड़ा भौतिकी न हो। हालांकि, अगर आपके पास बजट है तो 53+ गीगा फिजमेम शायद पहुंच से बाहर नहीं है।

If you decide to go the O_DIRECT route, check this out: http://stromberg.dnsalias.org/~strombrg/odirect/

0
जोड़ा
क्या आपके पास काम के लिए mmap के अलावा कोई अन्य सुझाव होगा?
जोड़ा लेखक drizzle123, स्रोत