1

私のプログラムは、ネットワーク ソケットから 1 行を読み取り、それをディスクに書き込みます。行は非常に長くなる可能性があり、文字列のパフォーマンスはひどいものだったので、遅延バイト文字列を使い始めました。hClose現在、Haskell は、実際にバイト文字列全体をディスクにフラッシュすることなく、ディスク ファイル ハンドルを通過するように見えるので、次のようにします。

  • 書き込み用にファイルを開く
  • バイト文字列をファイルに書き込むhPut
  • ファイルを閉じる
  • ファイルを読み取り用に開く

通常は になりopenFile: resource busy (file is locked)ます。

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

4

2 に答える 2

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
于 2012-04-13T09:48:06.843 に答える
0

lazy i/o や lazy byte 文字列の代わりに、strict バイト文字列で strict i/o を使用してみてください。

それが非効率的であることが判明した場合は、conduitまたは同様のパッケージを使用してみてください。

于 2012-04-01T08:21:35.660 に答える