最近のディスクは高速なのであまりIO Waitを意識することは少なくなりましたが、書き込み速度の遅いディスク(書き込みのコマンドのコストが高い)に何度も書き込みを実行すると、書き込みのトータルの時間が長くなる場合があります。  この投稿では、PHP版の簡単な「なんちゃって」BufferedWriterクラスを書いてみました。   通常であれば単純にfile_put_contentsメソッドを使って下記のように書けば十分です。   file_put_contents($filename, $chunk, FILE_APPEND|LOCK_EX);   しかし、大量のデータを何度も書き込む場合に、特にパフォーマンスの観点から下記の問題が出てきます。     file_put_contentsはfopenによるファイルオープン、書き込み、クローズを実行するので手軽ではありますが、書き込みのオーバーヘッドは高くなります。    file_put_contentsに限ったことではないが、メモリにある程度バッファしてから書き込むことで、書き込みの実行回数を減らすことでパフォーマンスを高めることができる(例: JavaのBufferedWriter)。   というわけで、上記の問題を解決すべく、PHP版「なんちゃって」BufferedWriterクラスを書いてみました。    <?php  class BufferedStreamFileWriter {     private $path;          private $bufferSize = 0;     private $bufferLimit;     private $buffer = '';          // constructor内でfopen     public function __construct($path, $bufferLimit, $mode='a') {         $this->path = $path;         $this->bufferLimit = $bufferLimit;         $this->handle = fopen($path, $mode);     }          // このメ...
IT関連の技術やプログラミングを中心に記事を書いています。ハードウェアも好きなので、日々のちょっとしたお役立ち情報も投稿しています。