ファイルのOPEN/SEEK/WRITE/CLOSEを繰り返し、大量のデータをファイルに書き込む
プログラムをマルチスレッド環境で実行した場合、ファイルオープン時の性能が
劣化することがあります。
これは、ファイルアクセスの繰り返し処理により、CPU への負荷状態が発生し、
OSで制御しているキャッシュデータのフラッシュタイミングと
ファイルオープン関数の実行タイミングが重なるために発生します。また、この事象は、Holonの順編成ファイルオープン関数を利用される場合でも、OS標準のファイルオープン関数を直接利用される場合でも発生します。
Holonのアプリケーションにて、これを回避するには以下の2つの方法があります。これらは、Microsoft社から提示されている回避策に基づいています。
-
ファイルオープン前にSleep(0)を実行する。
CPU パワーを他のスレッドに分散し、円滑にキャッシュされたデータがフラッシュされ、ファイルオープン時に他の割り込みが発生しなくなります。
-
書き込み後に、FlushFileBuffers()を実行する。
OS側のキャッシュ機能を利用せず、アプリケーション側でタイミングをつかむことにより、タイミングが重なることを防ぎます。
但し、CXLOPENFILE32関数を使用した場合にのみ利用可能です。
上記いずれかの方法により、ファイルオープン時の性能劣化は回避できますが、回避策をとることにより、他のスレッドにタイムスライスを分け与えたり、
OS側で行っているキャッシュによる書き込み性能向上を無効としてしまうことになり、
OPENからWRITEまでの全体的な処理速度が劣化することもあります。
しかし、CPU パワーの限界と、OSのファイルI/O キャッシュシステムと、スレッドのスケジューリングの関連により発生している現象となるため、上記回避方法以外に適切な改善方法は現状ありません。
|