2010-11-19 3 views
6

EDIT: По предложению И. Ф. Себастьяном, я могу получить ту же ошибку гораздо проще:Python «IOError: [Errno 22] Неверный аргумент» при использовании cPickle для записи большого массива в сетевом диске

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

    Welcome to pylab, a matplotlib-based Python environment. 
    For more information, type 'help(pylab)'. 

In [1]: open(r'c:\test.bin', 'wb').write('a'*67076095) 

In [2]: open(r'c:\test.bin', 'wb').write('a'*67076096) 

In [3]: open(r'z:\test.bin', 'wb').write('a'*67076095) 

In [4]: open(r'z:\test.bin', 'wb').write('a'*67076096) 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\User\<ipython console> in <module>() 

IOError: [Errno 22] Invalid argument 

In [5]: 

Обратите внимание, что C: - локальный диск, а Z: - сетевой диск.

ORIGINAL ВОПРОС:

Python 2.6.4 на Windows XP происходит сбой, если я использую cPickle записать файл больше, чем ~ 67 МБ до нашего сетевого диска (ReadyNAS Pro Pioneer Edition). Я хотел бы иметь возможность рассортировать большие файлы. Это известная проблема? Есть ли обходной путь?

Следующий сценарий приводит к аварии:

import cPickle, numpy 

a = numpy.zeros(8385007) 
print "Writing %i bytes..."%(a.nbytes) 
cPickle.dump(a, open('test_a.pkl', 'wb'), protocol=2) 
print "Successfully written." 

b = numpy.zeros(8385008) 
print "Writing %i bytes..."%(b.nbytes) 
cPickle.dump(b, open('test_b.pkl', 'wb'), protocol=2) ##Crashes on a network drive 
print "Successfully written." ##Doesn't crash on a non-network drive 

Вот шаги, которые я принять, чтобы произвести сбой в IPython строке:

Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] 
Type "copyright", "credits" or "license" for more information. 

IPython 0.10 -- An enhanced Interactive Python. 
?   -> Introduction and overview of IPython's features. 
%quickref -> Quick reference. 
help  -> Python's own help system. 
object? -> Details about 'object'. ?object also works, ?? prints more. 

    Welcome to pylab, a matplotlib-based Python environment. 
    For more information, type 'help(pylab)'. 

In [1]: pwd 
Out[1]: 'C:\\Documents and Settings\\User' 

In [2]: run test 
Writing 67080056 bytes... 
Successfully written. 
Writing 67080064 bytes... 
Successfully written. 

In [3]: cd Z: 
Z:\ 

In [4]: pwd 
Out[4]: 'Z:\\' 

In [5]: run 'C:\\Documents and Settings\\User\\test' 
Writing 67080056 bytes... 
Successfully written. 
Writing 67080064 bytes... 
--------------------------------------------------------------------------- 
IOError         Traceback (most recent call last) 

C:\Documents and Settings\User\test.py in <module>() 
     8 b = numpy.zeros(8385008) 
     9 print "Writing %i bytes..."%(b.nbytes) 
---> 10 cPickle.dump(b, open('test_b.pkl', 'wb'), protocol=2) 
    11 print "Successfully written." 
    12 

IOError: [Errno 22] Invalid argument 
WARNING: Failure executing file: <C:\\Documents and Settings\\User\\test.py> 

In [6]: 

C: это локальный жесткий диск на компьютере. Z: это наше сетевое хранилище.

+0

Примечание:' numpy' массив может законсервировать себя: 'a.dump'. – jfs

+1

Открывает (r'z: \ test.bin ',' wb '). Write (' a '* 67080064) 'работает? – jfs

+0

Отличный вопрос! Более простой способ воспроизвести ту же ошибку. Я отредактирую вопрос. – Andrew

ответ

15

Я считаю, что проблема связана с: http://support.microsoft.com/default.aspx?scid=kb;en-us;899149

... так, просто попробуйте: открытый (r'z: \ test.bin', 'ш + Ь') писать (. 'А «* 67080064)

* Примечание аргумент: 'W + B'

+0

Спасибо! Это работает. – Andrew

+0

open (r'z: \ test.bin ',' wb '). Write (' a '* 67076096) терпит неудачу, открываются (r'z: \ test.bin', 'wb'). Write ('a '* 67076095) не терпит неудачу, но слишком мала. К счастью, open (r'z: \ test.bin ',' w + b '). Write (' a '* 67076096) работает! – Andrew

+0

Не работает для Mac OS X. Патч, который исправляет это, находится на рассмотрении в течение длительного времени https://bugs.python.org/issue24658 – Serendipity