gpt4 book ai didi

python - 调用 close() 后大文件没有立即刷新到磁盘?

转载 作者:太空狗 更新时间:2023-10-29 17:17:42 24 4
gpt4 key购买 nike

我正在用我的 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.txtopen() 之后立即在磁盘上可见被调用,但仍保持大小 0B直到脚本结束
  • 如果我添加time.sleep(5)它只是按预期(或更确切地说是要求)开始工作

我已经找到了:

  • os.fsync() 但它似乎不起作用(use_file 的结果好像 C:\foo.txt 是空的)
  • 使用 buffering=(1<<20) (打开文件时)似乎也不起作用

我对这种行为越来越好奇。

问题:

  • python fork 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 的字节.

最佳答案

f.close() 调用 f.flush(),它将数据发送到操作系统。这不一定必须将数据写入磁盘,因为操作系统会对其进行缓冲。正如您正确计算的那样,如果您想强制操作系统将其写入磁盘,您需要 os.fsync()

您是否考虑过将数据直接传送到 use_file 中?


编辑:你说 os.fsync() “不起作用”。澄清一下,如果你这样做

f = open(...)
# write data to f
f.flush()
os.fsync(f.fileno())
f.close()

import pdb; pdb.set_trace()

再看看磁盘上的文件,有数据吗?

关于python - 调用 close() 后大文件没有立即刷新到磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13761961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com