[解決済み] Lazy I/Oの何がそんなに悪いのか?
質問
一般的に、プロダクションコードでは Lazy I/O を使用しない方が良いと聞いています。私の質問は、なぜかということです。おもちゃのようなものでなく、レイジー I/O を使用してもよいのでしょうか? そして、何が代替品 (たとえば列挙者) をより良くするのでしょうか?
どのように解決するのですか?
Lazy IO には、取得したリソースの解放が、プログラムがどのようにデータを消費するか(需要パターン)に依存するため、予測がつかないという問題があります。プログラムがリソースへの最後の参照を削除すると、GC は最終的に実行され、そのリソースを解放します。
レイジーストリームは 非常に でプログラムするのに便利なスタイルです。これがシェルパイプが楽しくて人気がある理由です。
しかし、リソースに制約がある場合 (高性能なシナリオや、マシンの限界までスケールすることを期待する生産環境のように)、GC にクリーンアップを依存することは不十分な保証になりえます。
スケーラビリティを向上させるために、時にはリソースを熱心に解放する必要があります。
では、遅延IOの代わりに、インクリメンタルな処理をあきらめない(その結果、多くのリソースを消費してしまう)方法は何でしょうか?私たちは
foldl
ベースの処理、別名 iteratees または enumerators があります。
Oleg Kiselyovによって2000年代後半に紹介されました。
と呼ばれ、それ以来、多くのネットワークベースのプロジェクトによって普及しました。
遅延ストリームとして、または1つの巨大なバッチとしてデータを処理する代わりに、最後のチャンクが読み込まれた時点でリソースの最終化が保証された、チャンクベースの厳密な処理を抽象化します。これはイテレートベースのプログラミングの本質であり、非常に優れたリソース制約を提供するものです。
イテレートベースのIOの欠点は、やや厄介なプログラミングモデルを持っていることです(素敵なスレッドベースの制御に対して、イベントベースのプログラミングにほぼ類似しています)。これは、どのプログラミング言語においても、間違いなく高度なテクニックです。そして、プログラミングの問題の大部分では、遅延IOは完全に満足のいくものです。しかし、多くのファイルを開いたり、多くのソケットで話したり、その他多くのリソースを同時に使用する場合は、イテレート (または列挙) アプローチが理にかなっている場合があります。
関連
-
[解決済み] Haskell - Ord aの型は何を意味するのでしょうか?
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] モナドはエンドファンクタのカテゴリではただのモノイドですが、何か問題でも?
-
[解決済み] PythonでUnicode(UTF-8)のファイル読み書きをする。
-
[解決済み] Lazy<T>はいつ使うべきですか?
-
[解決済み] 読んで学ぶべき良いHaskellのソース [終了しました]。
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み] 無限リストでのfoldlとfoldrの動作
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] Haskellの派生はどのように行われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Haskell タプルをリスト化する?
-
[解決済み】Template Haskellの何がそんなに悪いのか?
-
[解決済み] Emacs Interactive-Haskell repl は、cabal と working directory のいずれかが project directory に設定されると無応答になる。
-
[解決済み] GHCiから言語拡張を有効にするには?
-
[解決済み] <*>は何と呼ばれ、何をするのですか?[クローズド]
-
[解決済み] Haskellのprintfはどのように動作するのですか?
-
[解決済み] Real World Haskellのどの部分が今となっては時代遅れ、あるいはバッドプラクティスと考えられているのでしょうか?
-
[解決済み] インデックス付きモナドとは?
-
[解決済み] ハスケルでControl.Monad.Writerを遊ぶには?
-
[解決済み] Haskellのドット演算子:もっと説明が欲しい