問題タブ [lazy-io]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 遅延 IO での評価の強制
私のプログラムは、ネットワーク ソケットから 1 行を読み取り、それをディスクに書き込みます。行は非常に長くなる可能性があり、文字列のパフォーマンスはひどいものだったので、遅延バイト文字列を使い始めました。hClose
現在、Haskell は、実際にバイト文字列全体をディスクにフラッシュすることなく、ディスク ファイル ハンドルを通過するように見えるので、次のようにします。
- 書き込み用にファイルを開く
- バイト文字列をファイルに書き込む
hPut
- ファイルを閉じる
- ファイルを読み取り用に開く
通常は になりopenFile: resource busy (file is locked)
ます。
評価を強制し、ファイルを閉じる前にバイト文字列全体が書き込まれるのを待つことは可能ですか? その操作の後にファイルが実際に閉じられていることを確認できますか?
haskell - モナドアクションからの遅延出力
私は次のモナドトランスフォーマーを持っています:
基本的には、 Iteratee
pdf ドキュメントを読み取って処理する基盤を使用します (ドキュメントを常にメモリに保持しないように、ランダム アクセス ソースが必要です)。
PDFドキュメントを保存する関数を実装する必要があり、遅延させたいのですが、ドキュメントを一定のメモリに保存できるはずです。
lazy を生成できますByteString
:
ただし、実際の出力は前の出力に依存する場合があります。(詳細: pdf ドキュメントには、ドキュメント内のすべてのオブジェクトのバイト単位の絶対オフセットを持つ、いわゆる「参照テーブル」が含まれています。これByteString
は、シリアル化された pdf オブジェクトの長さに依存します。)
関数が呼び出し元に返す前にsave
全体を強制しないようにする方法は?ByteString
コールバックを引数として取り、出力するものがあるたびに呼び出す方が良いですか?
より良い解決策はありますか?
haskell - String の代わりに Text を使用した `interact`
interact
関数を書き直したいのですが、Text
代わりにString
. と同じ動作を使用Data.Text
および/または達成することは可能ですか?Data.Text.Lazy
interact
たとえば、次を使用してこのプログラムを実行するとString
:
1 行の入力を待ってから、応答として 1 行を出力し、次の入力行を待ちます。同じコードを書いて、Text
.
textInteract
ただし、このユースケースの特別なケースだけではありません。interact
すべての状況で同じように動作するようにします。
haskell - Haskellで同じファイルの読み取りと書き込みを同時に行うときにエラーが発生しました
ファイルをインプレースで変更する必要があります。そこで、ファイルの内容を読み取り、処理してから、同じファイルに出力を書き込むことを計画しました。
しかし、問題は、4行目のコメントを外した場合にのみ期待どおりに機能することです。コンソールに文字数を出力するだけです。コメントを外さないと、
そのファイルの読み取りを強制する方法はありますか?
haskell - Haskell の怠惰なバイト文字列の単語は怠け者ではありませんか?
整数の文字列の最大合計部分文字列を計算するための次の Haskell プログラムがあります。
このプログラムの問題は、ファイル全体をメモリに読み込むことです。BytesString のない対応するプログラムには、この問題はありません。
少量の一定量のメモリしか使用しませんが、もちろん非常に遅いです (約 25 倍遅くなります)。
この問題は、非常に大きな行を読み取るプログラムでのみ発生します。入力が複数の小さな行にまたがっている場合、ByteString は期待どおりに動作します。
これを回避する方法はありますか?
lazy-evaluation - hGetContents はどのようにメモリ効率を達成しますか?
ツールボックスに Haskell を追加したいので、Real World Haskellを使って作業しています。
入力と出力の章の のセクションでhGetContents
、次の例に出くわしました。
このコード サンプルに続いて、著者は次のように続けます。
hGetContents
がすべての読み取りを処理したことに注意してください。もご覧くださいprocessData
。副作用がなく、呼び出されるたびに常に同じ結果を返すため、これは純粋な関数です。この場合、入力がファイルから遅延して読み取られていることを知る必要はなく、知る方法もありません。20 文字のリテラルまたはディスク上の 500 GB のデータ ダンプで完全に機能します。 (注:強調は私のものです)
私の質問はhGetContents
、この例では「伝えることができない」ことなく、またはその結果の値がこのメモリ効率をどのように達成し、純粋なコード (つまり、メモ化) に生じるprocessData
すべての利点を維持するのですか?processData
<- hGetContents inh
は文字列を返すためinpStr
、 type の値にバインドされます。これは、受け入れるString
型とまったく同じです。processData
しかし、Real World Haskell の作成者を正しく理解していれば、この文字列はメモリに完全にロードされていない (または完全に評価されていない文字列が存在する場合は完全に評価されていない) という点で、他の文字列とはまったく異なります。 .) への呼び出し時までにprocessData
。
したがって、私の質問をする別の方法は次のとおりです。inpStr
への呼び出し時に が完全に評価されていないか、メモリにロードされていない場合、最初に を完全に評価せずに、processData
へのメモ化された呼び出しが存在するかどうかを調べるためにどのように使用できますか?processData
inpStr
String
それぞれが異なる動作をするが、このレベルの抽象化では区別できないタイプのインスタンスはありますか?
haskell - Haskell: 遅延 IO で障害を隠す
これは初心者の質問です。
おそらく次のような、画像の遅延ストリームを提供する関数を書きたいと思います。
残念ながら、画像を読み取る関数は失敗する可能性があるため、次のようになります。
したがって、私が書くことができる関数は次のようになります。
遅延 IO を維持しながら、次のような関数を実装するにはどうすればよいですか?
意味的にflattenImageStream
は、次の画像を要求すると、リストを反復処理して各画像を読み取ろうとする必要があります。ロードする画像が見つかるまでこれを行い、それを返します。
編集:答えにはいくつかの意見の相違があるようです。を使用するソリューションを提案している人もいますがsequence
、それをテストしたところ、怠惰を破壊することがわかったと確信しています。(コンピューターに戻ったときにもう一度テストして確認します。)unsafeInterleaveIO
. その関数のドキュメントから、うまくいくように見えますが、型システムを可能な限り尊重したいのは明らかです。
haskell - 「getCurrentDirectory: リソースが使い果たされました (開いているファイルが多すぎます)」エラーの防止
Parsec
多数の小さなファイルに対してパーサーを実行しようとしていますが、開いているファイルが多すぎるというエラーが表示されます。厳密な IO を使用する必要があることは理解していますが、その方法がわかりません。これは問題のあるコードです:
注:私の<<$>>
機能はこれです:
haskell - フォールドに遅延ストリーミングを取得するにはどうすればよいですか?
独自のストリーミング コードを作成するにはどうすればよいでしょうか。私は約 1,000,000,000 組のウォー デッキをランダムに生成していました。それらをフォールドに遅延ストリーミングしたかったのですが、スペース リークが発生しました。コードの関連セクションは次のとおりです。
-O2 を付けて実行すると、最初にコンピュータがフリーズし始め、次にプログラムが停止し、コンピュータが復活します (そして、Google Chrome には、すべてのリソースを使い果たしたことを私に怒鳴るのに必要なリソースがあります)。
注: unsafeInterleaveIO を試しましたが、うまくいきませんでした。