2012-01-26 11 views
9

मैं फाइल करने के लिए एक सरणी है, जहां मैं फ़ाइल इस तरह से खोल दिया लिखने के लिए कोशिश कर रहा हूँ:फोरट्रान मैं/हे: बड़े रिकॉर्ड निर्दिष्ट आकार

open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u)) 

यहाँ, u एक सरणी है और sizeof(u) +२७३००२५९२० है, जो ~ 2.5 जीबी है। जब मैं प्रोग्राम चलाता हूं, मुझे Fortran runtime error: RECL parameter is non-positive in OPEN statement त्रुटि मिलती है, जिसका मेरा मानना ​​है कि रिकॉर्ड आकार बहुत बड़ा है।

क्या इसे संभालने का कोई तरीका है? एक विकल्प एक से अधिक लिखने वाले कॉल में सरणी लिखना होगा जैसे प्रत्येक लेखन में रिकॉर्ड आकार 2.5 जीबी से छोटा है। लेकिन मैं सोच रहा हूं कि क्या मैं एक ही कॉल में पूरी सरणी लिख सकता हूं।

संपादित करें: udouble precision u(5,0:408,0:408,0:407) घोषित किया गया है कार्यक्रम के रूप में gfortran -O3 -fopenmp -mcmodel=medium test.f इस कार्यक्रम में कुछ OpenMP कोड नहीं है संकलित किया गया था, लेकिन फाइल आई/ओ अनुक्रमिक है।

gfortran वी 4.5.0, ओएस: OpenSUSE 11.3 पर 64 बिट AMD Opteron

आपकी मदद के लिए धन्यवाद।

उत्तर

16

जब तक कि यह स्मृति अनुमति देता है तब तक आपको बड़े सरणी लिखने में सक्षम होना चाहिए। ऐसा लगता है कि आप sizeof फ़ंक्शन के साथ पूर्णांक ओवरफ़्लो प्राप्त कर रहे हैं। sizeof फोरट्रान मानक नहीं है और मैं इसका उपयोग करने की अनुशंसा नहीं करता (कार्यान्वयन कंपेलरों के बीच भिन्न हो सकता है)। इसके बजाए, रिकॉर्ड लंबाई प्राप्त करने के लिए inquire कथन का उपयोग करना बेहतर अभ्यास है। मैं ifort के साथ अपनी समस्या को पुन: पेश करने में सक्षम था और यह समाधान मेरे लिए काम करता है। आप एक उच्च तरह चर की घोषणा के द्वारा पूर्णांक अतिप्रवाह से बचने कर सकते हैं:

integer(kind=8) :: reclen 

inquire(iolength=reclen)u 

open(unit=20,file='output.txt',form='unformatted',& 
    access='direct',recl=reclen) 

संपादित करें: कुछ जांच के बाद, यह एक gfortran समस्या लगती है। पूर्णांक reclen के लिए उच्च प्रकार की स्थापना करना ifort और pgf90 के लिए समस्या हल करता है, लेकिन gfortran के लिए नहीं - मैंने अभी संस्करण 4.6.2 के साथ यह कोशिश की है। भले ही reclen सही सकारात्मक मान है, ऐसा लगता है कि recl गोरफ्रान के साथ आंतरिक रूप से 32-बिट हस्ताक्षरित पूर्णांक है (धन्यवाद @ एमएसबी। इसे इंगित करने के लिए)। फोरट्रान रन-टाइम त्रुटि यह सुझाती है, और यह नहीं कि मान अधिकतम से बड़ा है। मुझे संदेह है कि यह एक ओएस मुद्दा है। यदि संभव हो, तो ifort (गैर-वाणिज्यिक उपयोग के लिए निशुल्क) का उपयोग करने का प्रयास करें: Intel Non-Commercial Software Download

+5

बस इसे जोड़ने के लिए: 'sizeof' बाइट्स की संख्या देता है और 'recl' बाइट्स में जरूरी नहीं है, इसलिए' पूछताछ 'करने का उचित तरीका है। – steabert

+0

@steabert इसके अलावा धन्यवाद, यह सही है। इसके लिए एक उदाहरण ओपी से कोड है, जो उदाहरण के लिए ifort के साथ तोड़ देगा - ifort मानता है कि recl तत्वों की संख्या के रूप में सरणी की लंबाई है, और बाइट्स की संख्या नहीं है। – milancurcic

+0

मुझे अभी भी वही त्रुटि मिलती है। ऐसा लगता है क्योंकि 'recl' ले जाने वाला अधिकतम मान 2147483648 (2 जीबी) है। – jitihsk

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