2016-12-12 4 views
1

Я пытаюсь прочитать большой двоичный файл (> 5 ГБ) с использованием os.open, mmap и from_buffer().Открыть для записи и чтения большого файла Python

Запуск fd = os.open(filePath, O_RDWR) Ошибка OSError: [Errno 22] Invalid argument: H:\\xyz.wdp поднят. Я понял, что проблема в том, что файл был слишком большим, поскольку с использованием похожих, но меньших файлов, O_WRONLY или O_RDONLY, он работал. К сожалению, если я использую O_WRONLY или O_RDONLY, доступ запрещен для from_buffer() функции (TypeError: mmap can't modify a readonly memory map.).

Мой пример кода:

class StructData(Structure): 
    _pack_ = 1 
    _fields_ = [('bin', c_ubyte)] 

fd = os.open(filePath, os.O_RDWR) 
mmap_file = mmap.mmap(fd, length=80, access=mmap.ACCESS_WRITE, offset=0) 
d_array = StructData*80 
data = d_array.from_buffer(mmap_file) 

Не могли бы вы помочь мне решить эту проблему? Я хочу добавить, что я работаю с большими файлами, и мне нужно, чтобы он работал очень быстро, я бы хотел избежать использования struct.unpack и так далее.

Спасибо!

+0

Как насчет [MCVE] (HTTP: // StackOverflow .com/помощь/mcve)? –

+0

Без дополнительной информации, очень сложно разобраться в вашей проблеме. Однако, похоже, что переменная filePath имеет синтаксическую ошибку, поэтому, если вы пишете то, что вы храните в ней, это было бы очень полезно. – Jalo

+0

Я обновил свой вопрос с примера кода – Pablo

ответ

1

С пути, похоже, вы используете Windows. В документации (https://docs.python.org/2/library/os.html#os.open) говорится, что для открытия файлов в двоичном режиме в Windows следует использовать os.O_BINARY. Вы пробовали следующее? (В случае, если Вы могли бы создать файл ...)

fd = os.open(filePath, os.O_RDWR | os.O_CREAT | os.O_TRUNC | os.O_BINARY) 

Я не знаю ситуацию в Windows, о поддержке больших файлов: https://docs.python.org/2/library/posix.html

+0

Да! Это сработало! В моем случае я не создаю новый файл, я просто его читаю, но 'from_buffer()' не может работать только с 'os.O_RDONLY'. Затем я использовал 'os.O_RDWR | os.O_BINARY', и это сработало! Важно, чтобы доступ mmap находился в 'mmap.ACCESS_WRITE'. Спасибо! – Pablo

 Смежные вопросы

  • Нет связанных вопросов^_^