2012-07-26 13 views
11

लिख रहाIOError: [errno 22] अमान्य तर्क जब पढ़ने/बड़े bytestring

IOError: [Errno 22] Invalid argument 

हो रही है जब मैं f.write(), जहां f मोड wb साथ खोला गया था के साथ डिस्क के लिए एक बड़ी bytestring लिखने की कोशिश।

मैंने विंडोज नेटवर्क ड्राइव का उपयोग करते समय बहुत से लोगों को यह त्रुटि प्राप्त कर देखा है, लेकिन मैं ओएसएक्स पर हूं (10.7 जब मैंने मूल रूप से प्रश्न पूछा लेकिन 10.8 अब मानक एचएफएस + स्थानीय फाइल सिस्टम के साथ)। मैं पाइथन 3.2.2 का उपयोग कर रहा हूं (एक python.org बाइनरी और होमब्री इंस्टॉल दोनों पर होता है)। मुझे सिस्टम पायथन 2.7.2 के साथ यह समस्या नहीं दिखाई दे रही है।

मैंने w+b पर this Windows bug workaround पर आधारित मोड भी कोशिश की, लेकिन निश्चित रूप से इससे मदद नहीं मिली।

डेटा एक बड़ी संख्यात्मक सरणी (लगभग 4 जीबी फ्लोट) से आ रहा है। यह ठीक काम करता है अगर मैं मैन्युअल रूप से स्ट्रिंग पर लूप करता हूं और इसे टुकड़ों में लिखता हूं। लेकिन क्योंकि मैं इसे एक पास में लिख नहीं सकता, np.save और np.savez असफल - क्योंकि वे केवल f.write(ary.tostring()) का उपयोग करते हैं। मुझे एक समान त्रुटि मिलती है जब मैं इसे मौजूदा HDF5 फ़ाइल में h5py के साथ सहेजने का प्रयास करता हूं।

ध्यान दें कि मैं एक ही समस्या है जब एक फ़ाइल file(filename, 'rb') के साथ खुला पढ़ने मिलती है: f.read() इस IOError देता है, जबकि f.read(chunk_size) उचित chunk_size कार्यों के लिए।

कोई विचार?

+0

अजीब। 'EINVAL' = 22, लेकिन ['मैन 2 लिखें'] में कुछ भी नहीं (https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man2/write.2.html) लागू दिखता है। क्या आप वास्तव में 'लिखने' syscall विफल होने की जांच के लिए ['dtruss'] (http://developer.apple.com/documentation/Darwin/Reference/Manpages/man1/dtruss.1m.html) के अंतर्गत चला सकते हैं? – ephemient

+0

"यह ठीक काम करता है अगर मैं मैन्युअल रूप से स्ट्रिंग पर लूप करता हूं और इसे टुकड़ों में लिखता हूं।" तो तुम क्यों नहीं? डेटा का एक हिस्सा कितना बड़ा लगता है कि आपको एक समय में लिखने में सक्षम होना चाहिए? आप 'size_t' के साथ गिन सकते हैं? – msw

+2

@msw जैसा मैंने कहा, यह 'np.save' तोड़ता है और मेरे लिए अधिक महत्वपूर्ण रूप से' h5py'। जाहिर है अगर मैं इसे मैन्युअल रूप से कर रहा हूं, तो मैं इसे टुकड़ों में लिख सकता हूं और लिख सकता हूं, और यह 'h5py' में काम करता है अगर मैं पहले डेटासेट बना देता हूं और कहता हूं, एक समय में 50 पंक्तियां। लेकिन यह आवश्यक नहीं होना चाहिए, क्योंकि इस तथ्य से प्रमाणित है कि उन दोनों पुस्तकालयों को ऐसा करने की आवश्यकता नहीं दिखती है। और मेरे सरणी "केवल" 500 मिलियन प्रविष्टियां हैं (लॉग_2 <2 9), जो 32-बिट 'int' द्वारा संबोधित करने योग्य है, अकेले' size_t' दें। सुझाव के लिए – Dougal

उत्तर

7

यह एक सामान्य ओएसएक्स बग फ्रेड/फेराइट के साथ प्रतीत होता है और इसलिए एक पायथन उपयोगकर्ता द्वारा वास्तव में ठीक नहीं किया जा सकता है। numpy #3858, this torch7 commit, this SO question/answer, ....

माना जाता है कि यह मैवरिक्स में तय किया गया है, लेकिन मुझे अभी भी समस्या दिखाई दे रही है।

पायथन 2 इस के आसपास काम कर सकता है या इसके आईओ मॉड्यूल ने बड़े पढ़ने/लिखने को हमेशा बफर किया होगा; मैंने पूरी तरह से जांच नहीं की है।

-2

शायद बी ध्वज के साथ नहीं खोलने का प्रयास करें, मुझे नहीं लगता था कि यह सभी ओएस/फाइल सिस्टम पर समर्थित था।

+0

[बाइनरी मोड] के लिए 'बी' ध्वज आवश्यक है (http://docs.python.org/py3k/library/functions.html?highlight=open#open), जो पाइथन 3 में इसका मतलब है कि यह तारों के बजाए बाइट्स को संभालता है। आप शायद इस बारे में सोच रहे हैं कि 'बी' पायथन 2 में यूनिक्स प्लेटफॉर्म पर नो-ऑप था, जो अब मामला नहीं है। – Dougal

+0

इसके अलावा, बस यह सुनिश्चित करने के लिए, मैंने अभी कोशिश की है (फ़ाइल 'w' के साथ फ़ाइल खोलना और' f.write (the_bytestring.decode ('latin1')) 'सही बाइटस्ट्रिंग के आधार पर आउटपुट गब्बरिश करने के लिए; IOError 22। – Dougal

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