Прямой ввод-вывод в Python с помощью O_DIRECTPython

Программы на Python
Ответить
Anonymous
 Прямой ввод-вывод в Python с помощью O_DIRECT

Сообщение Anonymous »

Я новичок в Python, и для некоторых проектов мне приходится использовать Python для ввода-вывода. Я начал с простого кода Python, который использует метод open() из модуля os, и код работал нормально.

Код: Выделить всё

#!/usr/bin/python

import os, sys, mmap

# Open a file
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT)
s = ' ' * 1024
# Write one string
os.write(fd, s)
# Close opened file
os.close( fd )
Теперь, поскольку я хочу использовать прямой ввод-вывод, я хочу использовать флаг O_DIRECT с open(), чтобы обойти все (или некоторые) эффекты кэша. К сожалению, если я открою файл с помощью O_DIRECT и впоследствии попытаюсь записать в этот файл, появится странное сообщение об ошибке:

OSError: [Errno 22] Неверный аргумент

Теперь, как предложено в этой статье: мне нужно использовать mmap для отображения части файла в память. Mmap работает с детализацией в одну страницу памяти — то есть 4кб. Таким образом, каждый буфер, отображаемый в памяти, естественным образом выравнивается по памяти до 4 КБ, то есть до границы 512 байт. Код с mmap:

Код: Выделить всё

#!/usr/bin/python

import os, sys, mmap

# Open a file
fd = os.open( "foo.txt", os.O_RDWR|os.O_CREAT|os.O_DIRECT)
m = mmap.mmap(-1, 1024)
s = ' ' * 1024
m.write(s)
# Write one string
os.write(fd, m)
# Close opened file
os.close( fd )
Мои вопросы:
  • В строке m = mmap.mmap(-1, 1024) я понимаю, что указание -1 является дескриптором файла, выделяющим оперативную память. Каково значение числа 1024?
  • Что делает s = ' ' * 1024? Опять же, какое значение здесь имеет число 1024?


Подробнее здесь: https://stackoverflow.com/questions/636 ... h-o-direct
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»