IOError: [Errno 22] Недопустимый аргумент при чтении/записи большого байта

Я получаю

IOError: [Errno 22] Invalid argument

когда я пытаюсь написать большую байтовую строку на диск с f.write(), где f был открыт с помощью режима wb.

Я видел много людей в Интернете, которые получали эту ошибку при использовании сетевого диска Windows, но я на OSX (10.7, когда я изначально задал вопрос, но теперь 10.8, со стандартной локальной файловой системой HFS +). Я использую Python 3.2.2 (происходит как в двоичном файле python.org, так и при установке homebrew). Я не вижу этой проблемы с системой Python 2.7.2.

Я также пробовал режим w+b на основе обходной обходной ошибки Windows, но, конечно, это не помогло.

Данные поступают из большого массива numpy (почти 4 ГБ поплавков). Он отлично работает, если я вручную перебираю строку и записываю ее в виде кусков. Но поскольку я не могу написать все за один проход, np.save и np.savez fail - поскольку они просто используют f.write(ary.tostring()). Я получаю аналогичную ошибку, когда я пытаюсь сохранить ее в существующий файл HDF5 с помощью h5py.

Обратите внимание, что я получаю ту же проблему при чтении файла, открытого с помощью file(filename, 'rb'): f.read(), дает этот IOError, а f.read(chunk_size) для разумного chunk_size работает.

Любые мысли?

Ответ 1

Это, по-видимому, общая ошибка OSX с fread/fwrite и поэтому на самом деле не может быть исправлена ​​пользователем Python. См. numpy # 3858, этот torch7 commit, этот SO-вопрос/ответ,....

Предположительно, это было исправлено в Mavericks, но я все еще вижу проблему.

Python 2, возможно, работал вокруг этого, или его модуль io мог всегда буферизовать большие чтения/записи; Я не исследовал полностью.

Ответ 2

Возможно, попробуйте не открывать флажок b, я не думал, что это поддерживается во всех ОС/файловых системах.