डिस्क पर बड़े मैट्रिक्स को स्टोर करने के लिए मैं numpy.memmap का उपयोग करता हूं।बेवकूफ कुशल बड़े मैट्रिक्स गुणा
यहाँ बड़ा आव्यूह गुणन परीक्षण करने के लिए एक नमूना कोड है:
import numpy as np
import time
rows= 10000 # it can be large for example 1kk
cols= 1000
#create some data in memory
data = np.arange(rows*cols, dtype='float32')
data.resize((rows,cols))
#create file on disk
fp0 = np.memmap('C:/data_0', dtype='float32', mode='w+', shape=(rows,cols))
fp1 = np.memmap('C:/data_1', dtype='float32', mode='w+', shape=(rows,cols))
fp0[:]=data[:]
fp1[:]=data[:]
#matrix transpose test
tr = np.memmap('C:/data_tr', dtype='float32', mode='w+', shape=(cols,rows))
tr= np.transpose(fp1) #memory consumption?
print fp1.shape
print tr.shape
res = np.memmap('C:/data_res', dtype='float32', mode='w+', shape=(rows,rows))
t0 = time.time()
# redifinition ? res= np.dot(fp0,tr) #takes 342 seconds on my machine, if I multiplicate matrices in RAM it takes 345 seconds (I thinks it's a strange result)
res[:]= np.dot(fp0,tr) # assignment ?
print res.shape
print (time.time() - t0)
तो मेरी प्रश्न हैं:
- कैसे जो उदाहरण के लिए कुछ मूल्य के लिए इस प्रक्रिया का उपयोग कर रहा है आवेदन की स्मृति consumtion प्रतिबंधित करने के लिए 100 एमबी (या 1 जीबी या कुछ और) तक। मुझे समझ में नहीं आता कि प्रक्रिया की स्मृति खपत का अनुमान कैसे लगाया जाए (मुझे लगता है कि स्मृति "केवल" आवंटित होती है जब "डेटा" चर बनाया जाता है, लेकिन जब हम memmap फ़ाइलों का उपयोग करते हैं तो कितनी मेमोरी उपयोग की जाती है?)
- डिस्क पर संग्रहीत बड़ी मैट्रिक्स के गुणा के लिए शायद कुछ इष्टतम समाधान है? उदाहरण के लिए, हो सकता है कि डेटा डिस्क पर ऑप्टिमाइज़ नहीं किया गया हो या डिस्क से पढ़ा न जाए, ठीक तरह से चिपकाया न जाए, और डॉट उत्पाद का उपयोग केवल एक कोर हो। शायद मुझे पीईटीबल्स की तरह कुछ उपयोग करना चाहिए?
इसके अलावा मुझे प्रतिबंधित स्मृति उपयोग के साथ समीकरणों (एसवीडी और अन्य) की रैखिक प्रणाली को हल करने में एल्गोरिदम में दिलचस्पी है। शायद इस एल्गोरिदम को आउट-ऑफ-कोर या पुनरावृत्त कहा जाता है और मुझे लगता है कि हार्ड ड्राइव < -> राम, जीपीयू राम < -> सीपीयू राम, सीपीयू राम < -> सीपीयू कैश जैसे कुछ समानताएं हैं।
भी here मुझे PyTables में मैट्रिक्स गुणा के बारे में कुछ जानकारी मिली।
इसके अलावा मुझे आर में this मिला लेकिन मुझे इसे पायथन या मैटलैब के लिए चाहिए।
"इस प्रक्रिया का उपयोग 100 एमबी के लिए कुछ मूल्य के लिए इस प्रक्रिया का उपयोग कर रहे स्मृति की स्मृति खपत को कैसे प्रतिबंधित करें" आपका मतलब है कि यदि एप्लिकेशन अधिक मेमोरी का उपयोग करने का प्रयास करता है तो यह असफल होना चाहिए? 'Psutil.set_rlimit' का उपयोग करना आसान है, लेकिन AFAIK यह केवल लिनक्स पर काम करता है। – Bakuriu
नहीं, मेरा मतलब है कि एप्लिकेशन को सामान्य के रूप में काम करना चाहिए, लेकिन घोषित स्मृति से कम उपयोग करना (आमतौर पर यह कम स्मृति के साथ धीरे-धीरे बोलना होगा, लेकिन यह उपयोगी है जब हम एप्लिकेशन मेमोरी उपयोग को प्रतिबंधित करना चाहते हैं या यदि हमारे पास फिट करने के लिए पर्याप्त स्मृति नहीं है पूरे मैट्रिक्स)। और मैं विंडोज पर काम करता हूं। – mrgloom
आपकी 'res' लाइन समझ में नहीं आता है (और res सबसे बड़ा सरणी है ...)। 'Np.dot' docstring को दोबारा पढ़ें, आपको कुछ उपयोगी मिलेगा ... – seberg