我正在使用 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() http://docs.python.org/2/library/os.html#os.fsync但它似乎不起作用(结果来自
use_file
就好像C:\foo.txt
是空的)
- Using
buffering=(1<<20)
(打开文件时)似乎也不起作用
我对这种行为越来越好奇。
问题:
- 有蟒蛇吗fork
close()
操作进入后台?这是在哪里记录的?
- 如何解决这个问题?
- 我错过了什么吗?
- 添加后
sleep
:这是 Windows/Python 的错误吗?
Notes:(针对对方有问题的情况)申请use_data
uses:
handle = CreateFile("foo.txt", GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, 0, NULL);
size = GetFileSize(handle, NULL)
然后处理size
字节来自foo.txt
.
f.close()
calls f.flush()
,它将数据发送到操作系统。那doesn't必须将数据写入磁盘,因为操作系统会对其进行缓冲。正如您正确地计算出的那样,如果您想强制操作系统将其写入磁盘,您需要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()
然后查看磁盘上的文件,有数据吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)