Большой файл не был записан на диск сразу после вызова close ()?
Я создаю большой файл с моим скриптом Python (более1GB
на самом деле их 8). Сразу после создания я должен создать процесс, который будет использовать эти файлы.
Сценарий выглядит так:
# This is more complex function, but it basically does this:
def use_file():
subprocess.call(['C:\\use_file', 'C:\\foo.txt']);
f = open( 'C:\\foo.txt', 'wb')
for i in 10000:
f.write( one_MB_chunk)
f.flush()
os.fsync( f.fileno())
f.close()
time.sleep(5) # With this line added it just works fine
t = threading.Thread( target=use_file)
t.start()
Но приложениеuse_file
действует какfoo.txt
пустой. Происходят странные вещи:
C:\use_file C:\foo.txt
в консоли (после завершения скрипта) я получаю правильные результатыесли я выполню вручнуюuse_file()
в другой консоли Python я получаю правильные результатыC:\foo.txt
виден на диске сразу послеopen()
назывался, но остается размер0B
до конца сценарияесли я добавлюtime.sleep(5)
это только начинает работать как ожидалось (или скорее требуется)Я уже нашел:
os.fsync()
но это не похоже на работу (результат отuse_file
как будтоC:\foo.txt
был пуст)С помощьюbuffering=(1<<20)
(при открытии файла) тоже не работаетМне все больше и больше интересно об этом поведении.
Вопросов:
Ли питонвилкаclose()
операция в фоновом режиме? Где это задокументировано?Как обойти это?Я что-то пропустил?После добавленияsleep
: это ошибка Windows / Python?Примечания: (на случай, если что-то не так с другой стороной)use_data
использует:
handle = CreateFile("foo.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
size = GetFileSize(handle, NULL)
А потом процессыsize
байты изfoo.txt
.