3

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

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

4

3 回答 3

2

它在某种程度上取决于文件系统,但在某些文件系统中,如果您在分配(全部)文件之前删除文件,则写入块的 IO 将永远不会发生。如果您截断它以使仍在写入的部分被切掉,这也可能是正确的。

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

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

于 2010-03-16T22:44:58.187 回答
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 更改为 Linux 的 /usr/lib 中的 libc.so.6,那么您应该可以继续使用了。基本上通过调用 close() 而不是 fclose(),不会调用 fsync(),也不会刷新任何内容。

希望这很有用。

于 2010-03-16T22:47:12.597 回答
1

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

于 2010-03-16T23:17:22.823 回答