2016-07-19 6 views
6

मैं डेटा के बड़े मैट्रिस (एनरो एक्स एनकॉल) के साथ काम कर रहा हूं जो स्मृति में संग्रहीत होने के लिए बहुत बड़े हैं। इसके बजाय, यह डेटा को बाइनरी फ़ाइल में सहेजने के लिए मेरे काम के क्षेत्र में मानक है। काम की प्रकृति के कारण, मुझे केवल एक समय में मैट्रिक्स के 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 वें 'कॉलम' को संशोधित करने के लिए मुझे क्या करने/बदलने की आवश्यकता है?

+0

[इन] (http://docs.julialang.org/en/release-0.4/stdlib/io-network/#memory-mapped-i-o) यहां कोई उपयोग है? – daycaster

+0

शायद वेक्टर अपडेट में '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 –

+0

[साझा आर्ट्रेज़] (http://docs.julialang.org/en/release-0.4 है /stdlib/parallel/#Base.SharedArray) आपके द्वारा अभी निर्दिष्ट किए गए सब कुछ करेगा। फ़ाइल नाम –

उत्तर

1

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) 
ओपी में

के बजाय

, लिखने

icol = 7 
stream_data = open("data","r+") 
position_data = 4*Nrow*(icol-1) 
seek(stream_data,position_data) 
write(stream_data,data_col) 
close(stream_data) 

अर्थात "r+" साथ "w" की जगह और सब कुछ काम करता है।

open का संदर्भ http://docs.julialang.org/en/release-0.4/stdlib/io-network/#Base.open है और यह विभिन्न तरीकों को बताता है। अधिमानतः open मूल कुछ हद तक भ्रमित लेकिन निश्चित रूप से धीमी स्ट्रिंग पैरामीटर के साथ उपयोग नहीं किया जाना चाहिए।

+1

के अनुसार प्रोफाइल/अनुकूलित करें ऐसा लगता है कि मैं वही चाहता हूं जो मैं चाहता था। और यह सुनिश्चित करने के लिए कि मैं समझता हूं कि आप स्ट्रिंग पैरामीटर के बारे में क्या कह रहे हैं, क्या आप कह रहे हैं कि 'stream_data = open ("data", true, true, false, false, false)' stream_data = स्तंभ को वापस बाइनरी फ़ाइल में लिखने के लिए खोलें ("डेटा", "आर +")? (और स्मृति में कॉलम पढ़ने के लिए कुछ समान) – Landon

1

आप जरूरत के लिए SharedArrays उपयोग कर सकते हैं आप का वर्णन:

data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols)) 
# do something with data 
data[:,1]=a[:,1].+1 
exit() 

# restart julia 
data=SharedArray("/some/absolute/path/to/a/file", Float32,(Nrow,Ncols)) 
@show data[1,1] 
# prints 1 

अब, ध्यान रखना चाहिए कि आप इस फाइल करने के लिए// से लिखने पढ़ने के लिए (यदि आप async श्रमिकों है) तुल्यकालन को संभालने के लिए माना जाता है और कि आपको सरणी के आकार को बदलने की आवश्यकता नहीं है (जब तक कि आप नहीं जानते कि आप क्या कर रहे हैं)।

+0

ऐसा लगता है कि यह चाल करेगा। जब आप ShareArray के रूप में डेटा लोड करते हैं तो यह डेटा को स्मृति में भी लोड करता है, या यह पूरी तरह से डिस्क से काम करता है? अगर यह डिस्क से पूरी तरह से काम करता है, तो क्या मुझे लगता है कि वर्तमान कॉलम को एक नए चर में निकालने के लिए सबसे तेज़ होगा ताकि मैं इसे स्मृति में काम कर सकूं? – Landon

+0

मुझे आपके सवालों के जवाब देने के लिए कोई दस्तावेज नहीं मिला। दूसरी तरफ, जुलिआ के पीछे दर्शन दिया गया है, आप बस कोशिश करें और बाद में –

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