Python 写入后是否中止对磁盘的慢速刷新?

Python 写入后是否中止对磁盘的慢速刷新?,python,linux,file-io,flush,Python,Linux,File Io,Flush,有没有一种方法可以中止python写操作,使操作系统觉得没有必要将未写入的数据刷新到光盘上 我正在向USB设备写入数据,通常是很多兆字节。我在写操作中使用4096字节作为块大小,但Linux似乎很早就缓存了一堆数据,并缓慢地将其写入USB设备。如果在写入过程中的某个时刻,我的用户决定取消,我希望应用程序立即停止写入。我可以看到,在数据停止从应用程序流出和USB活动指示灯停止闪烁之间有一个延迟。几秒钟,通常最多10秒钟。我发现应用程序正在close()方法中等待操作系统完成缓冲数据的写入。每次写入

有没有一种方法可以中止python写操作,使操作系统觉得没有必要将未写入的数据刷新到光盘上


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

这在某种程度上依赖于文件系统,但在某些文件系统中,如果在分配(所有)文件之前删除一个文件,则写入块的IO将永远不会发生。如果您将其截断,以便截断仍在编写的部分,也可能是这样

如果仍要访问数据,则不确定是否确实可以中止写入。此外,支持此功能的文件系统(例如xfs、ext4)通常不用于USB记忆棒


如果要将数据刷新到光盘,请使用fdatasync()。仅将IO库的缓冲区刷新到OS one不会实现任何物理刷新。

假设我理解正确,您希望能够“中止”而不刷新数据。这是可能的使用一个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更改为/usr/lib for Linux中的libc.so.6,那么您就可以开始了。基本上,通过调用close()而不是fclose(),不会调用fsync(),也不会刷新任何内容


希望有用。

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

Lee,这看起来应该可以工作,但是,我无法获得所需的行为。我调用了x.close(f.fileno()),它仍然在close()调用上执行刷新、阻塞,这与python close()命令完全相同。如果发生这种情况,那么实际上就不会调用.close()。您可以通过检查返回代码进行检查。如果你没有得到一个或一个数字,它就不起作用——如果你得到0(零),它就起作用了。这完全依赖于操作系统和文件系统。“正确”的行为(在正常异步装载下)是close()立即返回;如果显式使用fdatasync(),它应该只等待刷新。您不太可能找到一种可移植的方法来改变这种行为,因为它在不同的系统中会有很大的差异。(从XP开始,默认情况下,Windows甚至不向USB驱动器写入缓存。)