写入后中止慢速刷新到磁盘?

时间:2010-03-16 22:30:19

标签: python linux file-io flush

有没有办法以这样的方式中止python写操作,即操作系统认为没有必要将未写入的数据刷新到光盘?

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

3 个答案:

答案 0 :(得分:2)

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

如果您仍想访问数据,不确定是否可以真正中止写入。此外,支持此功能的文件系统(例如xfs,ext4)通常不会用在USB记忆棒上。

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

答案 1 :(得分:2)

假设我理解这是正确的,你希望能够“中止”而不是刷新数据。这可能是使用ctype和一个小pokery。这是非常依赖操作系统的,因此我将为您提供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更改为Linux的/ usr / lib中的libc.so.6,那么您应该很高兴。基本上通过调用close()而不是fclose(),不会调用fsync()并且不会刷新任何内容。

希望这很有用。

答案 2 :(得分:1)

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