मैं डेटा के बड़े मैट्रिस (एनरो एक्स एनकॉल) के साथ काम कर रहा हूं जो स्मृति में संग्रहीत होने के लिए बहुत बड़े हैं। इसके बजाय, यह डेटा को बाइनरी फ़ाइल में सहेजने के लिए मेरे काम के क्षेत्र में मानक है। काम की प्रकृति के कारण, मुझे केवल एक समय में मैट्रिक्स के 1 कॉलम तक पहुंचने की आवश्यकता है। मुझे कॉलम को संशोधित करने में सक्षम होना चाहिए और फिर अद्यतन कॉलम को बाइनरी फ़ाइल में वापस सहेजना होगा। अब तक मैंने यह पता लगाने में कामयाब रहा है कि मैट्रिक्स को बाइनरी फ़ाइल के रूप में कैसे सहेजना है और बाइनरी फ़ाइल से मैट्रिक्स के 1 'कॉलम' को मेमोरी में कैसे पढ़ा जाए। हालांकि, एक कॉलम की सामग्री को संपादित करने के बाद, मैं यह नहीं समझ सकता कि उस कॉलम को बाइनरी फ़ाइल में कैसे सहेजना है।जूलिया: एक मैट्रिक्स के कॉलम को कैसे संशोधित करें जिसे बाइनरी फ़ाइल के रूप में सहेजा गया है?
उदाहरण के तौर पर, मान लें कि डेटा फ़ाइल 32-बिट पहचान मैट्रिक्स है जिसे डिस्क में सहेजा गया है।
Nrow = 500
Ncol = 325
data = eye(Float32,Nrow,Ncol)
stream_data = open("data","w")
write(stream_data,data[:])
close(stream_data)
डिस्क से पूरी फ़ाइल पढ़ी और फिर मैट्रिक्स में वापस देगी सीधा है:
stream_data = open("data","r")
data_matrix = read(stream_data,Float32,Nrow*Ncol)
data_matrix = reshape(data_matrix,Nrow,Ncol)
close(stream_data)
जैसा कि मैंने पहले भी कहा, डेटा मैट्रिक्स के साथ मैं काम कर रहा हूँ भी स्मृति में पढ़ने के लिए बड़े हैं और नतीजतन ऊपर लिखा गया कोड आम तौर पर निष्पादित करना संभव नहीं होगा। इसके बजाय, मुझे एक समय में 1 कॉलम के साथ काम करने की ज़रूरत है। कि गुणांक '4' 'position_data' चर में है, क्योंकि मैं float32 साथ काम कर रहा हूँ
icol = 7
stream_data = open("data","r")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
data_col = read(stream_data,Float32,Nrow)
close(stream_data)
नोट: निम्न स्मृति में मैट्रिक्स के 1 स्तंभ (उदाहरण के लिए 7 वीं स्तंभ) को पढ़ने के लिए एक समाधान है। इसके अलावा, मैं पूरी तरह से समझ में नहीं आता क्या तलाश आदेश यहाँ क्या कर रहा है, लेकिन यह मुझे सही उत्पादन निम्नलिखित परीक्षणों के आधार पर दे रही है किया जा रहा है:
data == data_matrix # true
data[:,7] == data_col # true
इस समस्या के लिए, मान लीजिए कि मेरे पास है निर्धारित किया है कि स्तंभ मैं लोड (7 स्तंभ यानी) शून्य से बदला जाना आवश्यक:
data_col = zeros(Float32,size(data_col))
समस्या अब, अन्य में से किसी को प्रभावित किए बिना कैसे बाइनरी फ़ाइल में इस स्तंभ को वापस को बचाने के लिए यह पता लगाने की है डेटा। स्वाभाविक रूप से मैं इस कार्य को करने के लिए 'लिखने' का उपयोग करना चाहता हूं। हालांकि, मुझे पूरी तरह से यकीन नहीं है कि कैसे आगे बढ़ना है। मुझे पता है कि मुझे डेटा में एक स्ट्रीम खोलकर शुरू करना होगा; हालांकि मुझे यकीन नहीं है कि मुझे किस 'मोड' का उपयोग करने की ज़रूरत है: "डब्ल्यू", "डब्ल्यू +", "ए", या "ए +"?
icol = 7
stream_data = open("data","w")
position_data = 4*Nrow*(icol-1)
seek(stream_data,position_data)
write(stream_data,data_col)
close(stream_data)
मूल बाइनरी फ़ाइल (से पहले अपने में विफल रहा है बाइनरी फ़ाइल संपादित करने के लिए प्रयास) डिस्क पर 650000 बाइट्स पर कब्जा कर लिया: यहाँ एक असफल का उपयोग कर "डब्ल्यू" प्रयास है। यह इस तथ्य के अनुरूप है कि मैट्रिक्स आकार 500x325 है और Float32 संख्या 4 बाइट्स (यानी 4 * 500 * 325 = 650000) पर कब्जा कर लेती है। हालांकि, बाइनरी फ़ाइल को संपादित करने के मेरे प्रयास के बाद मैंने देखा है कि बाइनरी फ़ाइल अब केवल 14000 बाइट स्पेस पर है। कुछ त्वरित मानसिक गणित से पता चलता है कि 14000 बाइट डेटा के 7 कॉलम (4 * 500 * 7 = 14000) से मेल खाते हैं। एक त्वरित जांच पुष्टि करता है कि बाइनरी फ़ाइल ने सभी मूल डेटा को आकार 500x7 के साथ एक नए मैट्रिक्स के साथ बदल दिया है, और जिनके तत्व सभी शून्य हैं।
stream_data = open("data","r")
data_new_matrix = read(stream_data,Float32,Nrow*7)
data_new_matrix = reshape(data_new_matrix,Nrow,7)
sum(abs(data_new_matrix)) # 0.0f0
बाइनरी फ़ाइल में केवल 7 वें 'कॉलम' को संशोधित करने के लिए मुझे क्या करने/बदलने की आवश्यकता है?
[इन] (http://docs.julialang.org/en/release-0.4/stdlib/io-network/#memory-mapped-i-o) यहां कोई उपयोग है? – daycaster
शायद वेक्टर अपडेट में 'stream_data = open (" data "," w ")' to 'stream_data = open (" data "," w + ") 'बदलें। 'W +' पर ध्यान दें। प्रासंगिक दस्तावेज http://docs.julialang.org/en/release-0.4/stdlib/io-network/#Base.open –
[साझा आर्ट्रेज़] (http://docs.julialang.org/en/release-0.4 है /stdlib/parallel/#Base.SharedArray) आपके द्वारा अभी निर्दिष्ट किए गए सब कुछ करेगा। फ़ाइल नाम –