2012-07-26 75 views
11

當我得到IO錯誤:[錯誤22]讀/寫大字節字符串

IOError: [Errno 22] Invalid argument 

當我嘗試寫一個大的字節串到磁盤f.write(),其中f與模式wb打開參數無效。

我在網上看到很多人在使用Windows網絡驅動器時出現這個錯誤,但是我在OSX上(當我最初問這個問題的時候是10.7,而現在是一個標準的HFS +本地文件系統的時候是10.8)。我正在使用Python 3.2.2(發生在python.org二進制文件和自制軟件安裝上)。我沒有看到系統Python 2.7.2的這個問題。

我也試過模式w+b根據this Windows bug workaround,但當然這並沒有幫助。

數據來自一個大的numpy數組(幾乎是4GB的浮點數)。它工作正常,如果我手動循環的字符串,並把它寫出來塊。但是因爲我無法一次寫完全部,所以np.savenp.savez失敗 - 因爲它們只是使用f.write(ary.tostring())。當我嘗試將其保存到與h5py一個現有的HDF5文件時,我收到類似的錯誤。

注意閱讀與file(filename, 'rb')打開一個文件時,我得到了同樣的問題:f.read()給出了這樣的IOError,而f.read(chunk_size)合理chunk_size作品。

有什麼想法?

+0

奇怪。 'EINVAL' = 22,但['man 2 write'](https://developer.apple.com/library/mac/documentation/darwin/reference/manpages/man2/write.2.html)中沒有任何內容適用。你可以運行['dtruss'](http://developer.apple.com/documentation/Darwin/Reference/Manpages/man1/dtruss.1m.html)來檢查它是否真的是'寫'系統調用失敗? – ephemient 2012-07-29 05:19:51

+0

「如果我手動在字符串上循環並將其寫入塊中,它工作正常。」那爲什麼不呢?您認爲您應該能夠一次編寫多大的數據?你可以用'size_t'來計算嗎? – msw 2012-07-29 05:39:41

+2

@msw就像我說的,這打破了'np.save',更重要的是我'h5py'。很顯然,如果我手動完成這項工作,我可以並且確實將它寫入塊中,並且如果我先創建數據集並一次寫入50行,那麼它可以在'h5py'中運行。但這不應該是必要的,正如證明這些圖書館沒有看到需要這樣做的事實。而我的數組「只有」5億個條目(log_2 <29),可以通過32位的int來尋址,更不用說size_t了。 – Dougal 2012-07-29 06:38:53

回答

7

這似乎是fread/fwrite的一般OSX錯誤,所以不能由Python用戶真正解決。請參閱numpy #3858,this torch7 commit,this SO question/answer,...

據說它已在小牛隊修復,但我仍然看到這個問題。

Python 2可能已經解決了這個問題,或者它的io模塊可能總是緩衝大的讀/寫;我沒有徹底調查過。

-2

也許嘗試不用b標誌打開,我不認爲這是支持所有操作系統/文件系統。

+0

'b'標誌對[二進制模式]是必需的(http://docs.python.org/py3k/library/functions.html?highlight=open#open),它意味着在python 3中,它處理字節而不是字符串。你可能想到的是,在Python 2的Unix平臺上,'b'是不可操作的,現在不再是這種情況了。 – Dougal 2012-08-29 23:37:22

+0

此外,爲了確保,我只是試了一下(用'w'打開文件並執行'f.write(the_bytestring.decode('latin1'))'來輸出基於真正字節串的亂碼;得到了相同的IOError 22。 – Dougal 2012-08-30 00:09:02