2012-03-31 22 views
1

私のプログラムはネットワークソケットから行を読み込んでディスクに書き込みます。行は本当に長くて文字列がひどいので、私は遅延バイト文字列を使い始めました。レイジーIOの強制評価

  • 開いているファイルをhPut
  • 近いファイルのファイルに
  • 書き込みバイト文字列を書き込むために:今ではHaskellは実際にディスクへの全バイト文字列を洗い流す、そうせずにディスクファイルハンドルにhClose過ぎて行くようです

を読み取るための

  • 開いているファイルは、通常openFile: resource busy (file is locked)になります。

    評価を強制し、ファイルを閉じる前にすべてのバイト文字列が書き込まれるのを待つことができるので、その操作後にファイルが実際に閉じられていることを確認できますか?

  • +0

    あなたは[ 'hFlush'](http://hackage.haskell.org/packages/archive/base/latest/doc/html/System-IO.html#v:hFlush)で見たことがありますか? – huon

    +0

    フラッシングは、 'hClose'と同様、待たずにGHCを通過します。 –

    答えて

    0

    他の唯一の答えは「何か他のものを使用する」バラエティなので、私自身のソリューションを投稿しています。 hCloseの後にこの関数を使用すると、レイジー書き込みが完了するまでスレッドが停止します。

    waitForLazyIO location = do 
        t <- liftIO $ try $ openFile location AppendMode 
        handle t 
        where 
         handle (Right v) = hClose v 
         handle (Left e) 
          -- Add some sleep if you expect the write operation to be slow. 
          | isAlreadyInUseError e = waitForLazyIO location 
          | otherwise = throwError $ show e 
    
    +0

    これはうまくいくかもしれませんが、率直に言って、これはハックであり、実際には通常のソフトウェア標準の標準には達していません。怠惰なIOパスは、概念が深く静かに壊れているため、トラップでいっぱいです。現時点では、定数メモリIO操作の実行可能な唯一のオプションは、[conduit](http://hackage.haskell.org/package/conduit)が人気のあるメンバーの左倍数列挙子のファミリです。 –

    0

    遅延I/Oと遅延バイト文字列の代わりに厳密なバイト文字列で厳密なI/Oを使用してみてください。

    これがあまりにも効率が悪いと判明した場合は、conduitまたは同様のパッケージをお試しください。

    関連する問題