Прервать медленный сброс на диск после записи? - PullRequest
3 голосов
/ 17 марта 2010

Есть ли способ прервать операцию записи на python таким образом, чтобы ОС не чувствовала необходимости записывать неписанные данные на диск?

Я записываю данные на USB-устройство, обычно много мегабайт. Я использую 4096 байт в качестве размера блока при записи, но похоже, что Linux рано кэширует кучу данных и медленно записывает их на USB-устройство. Если в какой-то момент во время записи мой пользователь решит отменить, я хочу, чтобы приложение немедленно прекратило запись. Я вижу, что есть задержка между тем, когда данные перестают поступать из приложения, и индикатор активности USB перестает мигать. Несколько секунд, обычно до 10 секунд. Я считаю, что приложение удерживается в методе close (), я полагаю, ожидая, пока ОС завершит запись буферизованных данных. Я вызываю flush () после каждой записи, но это никак не влияет на задержку. Я искал документы на Python для ответа, но ничего не нашел.

Ответы [ 3 ]

2 голосов
/ 17 марта 2010

Если я правильно понимаю, вы хотите иметь возможность «прервать», а НЕ сбрасывать данные. Это возможно, используя ctype и немного покеры. Это сильно зависит от ОС, поэтому я дам вам версию OSX и затем, что вы можете сделать, чтобы изменить ее на Linux:

f = open('flibble1.txt', 'w')
f.write("hello world")
import ctypes
x = ctypes.cdll.LoadLibrary('/usr/lib/libc.dylib')
x.close(f.fileno())
try:
  del f
catch IOError:
  pass

Если вы измените /usr/lib/libc.dylib на libc.so.6 в / usr / lib для Linux, тогда вам будет хорошо. По сути, вызывая close () вместо fclose (), вызов fsync () не выполняется и ничего не сбрасывается.

Надеюсь, это полезно.

2 голосов
/ 17 марта 2010

Это в некоторой степени зависит от файловой системы, но в некоторых файловых системах, если вы удалите файл до того, как он будет выделен, все операции ввода-вывода для записи блоков никогда не произойдут. Это также может быть правдой, если вы обрежете его так, что часть, которая все еще записывается, обрезается.

Не уверен, что вы действительно можете прервать запись, если хотите получить доступ к данным. Также типы файловых систем, которые поддерживают это (например, xfs, ext4), обычно не используются на флешках USB.

Если вы хотите сбросить данные на диск, используйте fdatasync (). Простая очистка буфера вашей библиотеки ввода-вывода в ОС не приведет к физической очистке.

1 голос
/ 17 марта 2010

Когда вы прерываете операцию записи, попробуйте выполнить file.truncate(0); перед закрытием.

...