問題タブ [bytestring]
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 - ByteString ヒストグラム
(厳密な) ByteString が与えられた場合、含まれる可能性のある各バイトの数を数える最も効率的な方法は何ですか?
カウントソートとして実装されるはずですsortが、関連するカウントにアクセスする方法はないようです。countまた、特定のバイトが出現する回数をカウントする関数があることもわかります。これにより、次のオプションが得られます。
map (\ b -> count b str) [0x00 .. 0xFF]map length . group . sortfold*およびIntMapバイト周波数の何か。
最高のパフォーマンスを発揮する可能性が高いのはどれですか?
haskell - Haskell: ghci は "Chunk .. Empty" を表示しますか?
Learn You a Haskellには、次のようなコード例があります。
(Bの略Data.ByteString.Lazy)
しかし、私はデータコンストラクターを表示しghciません。ChunkEmpty
Haskell の開発者は の値ByteStringが出力される方法を変更しましたか?
haskell - Haskell ByteString readInt 戻り値の型の問題
現在、関数 Data.ByteString.Char8.readInt を使用して「Maybe (Int, ByteString)」の戻り値の型を処理する方法を理解しようとしています。型チェックによって Maybe を削除しましたが、さらに処理する方法がわかりません。私が今持っている「(Int, ByteString)」の型。おそらく明らかな何かが欠けているように感じます。誰かが私を正しい方向に向けてくれることを願っています。どんな助けでも大歓迎です!
haskell - Haskell の ST Monad での文字列データの効率的なロギング
STモナド内での実行中に最大280Mのログテキストデータを生成するHaskellプログラムがあります。これは、事実上すべてのメモリ消費が発生する場所です (ロギングを無効にすると、プログラムは合計 3MB の実メモリを割り当てます)。
問題は、メモリが不足していることです。プログラムの実行中にメモリ消費量が 1.5GB を超え、ログ文字列をファイルに書き込もうとすると、最終的にメモリが不足します。
ログ関数は文字列を受け取り、環境内の STRef に格納されている文字列ビルダーにログ データを蓄積します。
強打パターンやmodifySTRef'を使って厳密性を導入してみましたが、メモリ消費がさらに悪化しました。
次のように、hPutBuilder のドキュメントで推奨されているように、ログ文字列を書き込みます。
これにより、さらに数 GB のメモリが消費されます。さまざまなバッファリング設定を試し、最初に遅延 ByteString に変換しました (少し改善されました)。
質問:
プログラムの実行中にメモリ消費を最小限に抑えるにはどうすればよいですか? 厳密な ByteString 表現と適切な量の厳密さを考えると、保存している実際のログ データの ~280M よりも少し多くのメモリが必要になると予想されます。
メモリを割り当てずに結果をファイルに書き込むにはどうすればよいですか? 常駐データをファイルにストリーミングするだけで、Haskell が何 GB ものメモリを必要とする理由がわかりません。
編集:
小規模な実行 (最大 42 MB のログ データ) のメモリ プロファイルを次に示します。ロギングを無効にした場合、合計メモリ使用量は 3MB です。
編集:
求められたように、小さなログを実行してメモリ プロファイルを実行しました。
プロフィール http://imageshack.us/a/img14/9778/6a5o.png
該当箇所にバンパターン、$!、deepseq/$!!、force などを入れてみましたが、あまり変わらないようです。これらすべての [Char] リストと未評価のサンクを保持する代わりに、Haskell に実際に文字列/printf 式などを取得させ、それをタイトな ByteString に入れるにはどうすればよいですか?
編集:
これが実際の完全なトレース機能です
これは「厳密」で十分ですか?ReaderT/ST モナド内でこの型クラス関数を呼び出す場合、何か注意する必要がありますか? 実際に呼び出され、決して延期されないようにするためです。
結構です?
ありがとう!
haskell - Haskell で一時的な ByteString を作成して破棄するとメモリが消費されるのはなぜですか?
これは、1MIntの数字を作成してリストに入れるコードです。
(私はそれがより最適かもしれないことを知っています (sumでfold) しかし、私のポイントは異なります.) そして、このバージョンを見てください.
このバージョンには 90MB のメモリが必要です。なんで?ここにプロファイリング出力があります

紫のエリアは?
コメントを読んだ後に編集 して、明確化を追加したいと思います。
これはテストです。メモリに 1M の数値を保持したい (ルックアップ テーブルを作成しています)。だから私は「リスト全体を強制的にメモリに保持したい」のです。しかし、バイト文字列を保持したくありません。私の小さなコードは、ディスクからバイト文字列をロードし、それを整数に変換し、整数をメモリに保持する場合のシミュレーションです。(それが私の目標です)。しかし、どういうわけかバイト文字列がメモリに残ります。なんで?
arrays - Haskellで矩形データを保存およびソートする最良の方法は何ですか?
合計で約 1,700 万行を含む少数の ASCII ファイルがあり、各行またはほとんどの行に 36 バイトの固定識別子があります。したがって、私のデータは長方形です。固定幅の行がたくさんあります。Haskell を使用して、すべての行を読み取り、正規表現を使用して識別子を抽出し (そこまでは問題ありません)、それらを並べ替えて一意の識別子の数をカウントします (に非常に近いgrep | sort | uniq)。(各ファイルから並列に読み取ることで、すでに並列化しています。)単純な問題のように聞こえますが...
ソート段階の前であっても、この問題からまともなパフォーマンスを引き出すのは難しいと思います。これが私が持っている限りです。 String36 バイトの ASCII ではやり過ぎなので、ByteString. しかし、サイズが 1700 万の (リンクされた) リストは悪い考えのように思えるので、試してみIOVector ByteStringました。しかし、これはかなり遅いようです。ベクトルに何百万もの小さな ByteString を保持しているため、ガベージ コレクションに問題がある+RTS -sと思います。
Repa またはある種の単一の巨大なByteString/ IOVector Char8/whatever を使用して (各行の正確な幅が 36 であることを知っているため)、スレッドごとに 1 つの巨大な長方形配列にデータを格納する必要があると考えていました。これにより、GC の問題が軽減されます。 . ただし、後で行を並べ替える必要はあります。Repa は並べ替えをサポートしていないようで、自分で並べ替えアルゴリズムを作成したくありません。そのため、巨大な長方形の配列を持ちながら、それを並べ替える方法がわかりません。
使用するライブラリ、設定する GC フラグ、またはその他の提案はありますか? マシンには 24 個のコアと 24 GB の RAM があるため、ハードウェアの制約はありません。Haskell に残りたいのは、問題なく動作している関連コード (同じファイルを解析し、要約統計を生成している) がたくさんあり、それを書き直したくはないからです。
haskell - Haskell の怠惰なバイト文字列の単語は怠け者ではありませんか?
整数の文字列の最大合計部分文字列を計算するための次の Haskell プログラムがあります。
このプログラムの問題は、ファイル全体をメモリに読み込むことです。BytesString のない対応するプログラムには、この問題はありません。
少量の一定量のメモリしか使用しませんが、もちろん非常に遅いです (約 25 倍遅くなります)。
この問題は、非常に大きな行を読み取るプログラムでのみ発生します。入力が複数の小さな行にまたがっている場合、ByteString は期待どおりに動作します。
これを回避する方法はありますか?
haskell - パフォーマンスを犠牲にすることなく、折り畳みでスタックオーバーフローを回避するHaskell
次のコードでは、大きな入力に対してスタック オーバーフローが発生します。
述語がサンクのリストを作成していると思いますが、その理由や修正方法がわかりません。
を使用した同等のコードfoldl'は正常に実行されますが、常に追加され、大量のメモリを使用するため、永遠に時間がかかります。
最初のスニペットがサンクを蓄積する原因は何ですか? また、それを回避することはできますか? 依存しないように2番目のスニペットを書くことは可能(++)ですか?