2010-03-16 99 views
3

有没有办法中止python写入操作,使操作系统感觉不需要将未写入的数据刷新到光盘?写入后中止缓冲到磁盘?

我正在写数据到USB设备,通常是很多兆字节。我在写入时使用了4096个字节作为我的块大小,但看起来Linux很早就缓存了大量数据,并将其慢慢写入USB设备。如果在写入过程中的某个时候,我的用户决定取消,我希望应用立即停止写入。我可以看到从应用程序停止流动数据到USB活动指示灯停止闪烁之间存在延迟。几秒钟,通常高达约10秒。我发现应用程序保存在close()方法中,我假设,等待操作系统完成写入缓冲数据。每次写入后我都调用flush(),但这对延迟没有任何影响。我已经搜索了python文档的答案,但没有发现任何东西。

+0

这完全取决于OS和文件系统。 “正确的”行为(在正常情况下,异步挂载)是close()立即返回;它应该只等待刷新,如果你明确fdatasync()。你不可能找到一种便携的方式来改变这种行为,因为它会在各个系统之间变化很大。 (从XP左右开始,Windows甚至不会在默认情况下将缓存写入USB驱动器。) –

回答

2

它有点依赖于文件系统,但在某些文件系统中,如果您在分配文件之前(全部)删除文件,写入块的IO将永远不会发生。如果你截断它,那么这也可能是真实的,以便正在写入的部分被截断。

如果您仍想访问数据,不确定是否可以放弃写入。另外,支持这种文件系统的类型(例如xfs,ext4)通常不在USB记忆棒上使用。

如果要将数据刷新到光盘,请使用fdatasync()。只需将IO库的缓冲区清理到操作系统中,就不会实现任何物理刷新。

+0

嗯......这很有趣,让我尝试一下... – Therealstubot

2

假设我理解这个正确的,你希望能够'中止'和不刷新数据。这是可能的,使用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在Linux的/ usr/lib中,那么你应该很好。基本上通过调用close()而不是fclose(),不会调用fsync(),也不会刷新任何内容。

希望这很有用。

+0

Lee,这看起来应该可以工作,但是,我无法获得理想的行为。我调用了x.close(f.fileno()),它仍然在close()调用上执行flush和blocking操作,就像python close()命令一样。 – Therealstubot

+0

如果发生这种情况,那么.close()实际上并没有被调用。您可以通过检查返回码来检查。如果你得到无或数字,它不起作用 - 如果你得到0(零),那么它确实。 – Lee

1

当您中止写入操作时,在关闭它之前尝试执行file.truncate(0);