3

書き込まれていないデータをディスクにフラッシュする必要があるとOSが感じないように、Pythonの書き込み操作を中止する方法はありますか?

USBデバイスにデータを書き込んでいます。通常は数メガバイトです。書き込みのブロックサイズとして4096バイトを使用していますが、Linuxは早い段階で大量のデータをキャッシュし、USBデバイスにゆっくりと書き込みます。書き込み中のある時点で、ユーザーがキャンセルすることを決定した場合、アプリにただちに書き込みを停止させたいと思います。アプリケーションからのデータの流れが止まってから、USBアクティビティライトの点滅が止まるまでに遅延があることがわかります。数秒、通常は最大約10秒。アプリがclose()メソッドを保持していることがわかりました。これは、OSがバッファリングされたデータの書き込みを完了するのを待っていると思います。書き込みのたびにflush()を呼び出しますが、遅延に影響はないようです。私は答えを求めてPythonのドキュメントを調べましたが、何も見つかりませんでした。

4

3 に答える 3

2

これはファイルシステムに多少依存しますが、一部のファイルシステムでは、(すべての)ファイルが割り当てられる前にファイルを削除すると、ブロックを書き込むためのIOが発生しなくなります。これは、まだ書き込まれている部分が切り取られるように切り捨てた場合にも当てはまる可能性があります。

それでもデータにアクセスしたい場合は、書き込みを実際に中止できるかどうかはわかりません。また、これをサポートする種類のファイルシステム(xfs、ext4など)は、通常、USBスティックでは使用されません。

データをディスクにフラッシュする場合は、fdatasync()を使用します。IOライブラリのバッファをOSにフラッシュするだけでは、物理的なフラッシュは実現されません。

于 2010-03-16T22:44:58.187 に答える
2

私がこれを正しく理解していると仮定すると、データをフラッシュするのではなく、「中止」できるようにする必要があります。これは、ctypeと少しのpokeryを使用して可能です。これはOSに大きく依存するため、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

Linuxの場合は/usr/ lib/libc.dylibを/usr/ libのlibc.so.6に変更すると、問題がないはずです。基本的に、fclose()の代わりにclose()を呼び出すことにより、fsync()の呼び出しは行われず、何もフラッシュされません。

それがお役に立てば幸いです。

于 2010-03-16T22:47:12.597 に答える
1

書き込み操作を中止する場合は、file.truncate(0);閉じる前に実行してみてください。

于 2010-03-16T23:17:22.823 に答える