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: это наше сетевое хранилище.
Примечание:' numpy' массив может законсервировать себя: 'a.dump'. – jfs
Открывает (r'z: \ test.bin ',' wb '). Write (' a '* 67080064) 'работает? – jfs
Отличный вопрос! Более простой способ воспроизвести ту же ошибку. Я отредактирую вопрос. – Andrew