1

かなり大きなファイルを解析しています。これまでに解析したファイルの量を示すために、プログレスバーを定期的に更新したいと思います。

これを行うために私が考えることができる最も直接的な方法はParsecT、モナド変換子として使用して、進行状況IOバーの更新の印刷を解除Handleし、をストリームプロバイダーとして使用して、とを使用して進行状況を確認できるようにすることhFileSizeですhTell

つまり、インスタンスが必要Stream Handle IO Charです。(を使用して)自分でロールするのは難しいことではありませんがhGetChar、予期しない問題(速度のためにバッファリングを挿入する必要があるかどうかなど)を処理するために、すでに存在するかどうかを確認することにしました。

4

1 に答える 1

2

1 つのハックは、事前にファイルのサイズをチェックすることです。次に、構文解析を行っているときに、SourcePosその parsec が使用可能にする をチェックして、どこまで到達したかを確認します。これの欠点は、実際のバイト数を追跡​​したい場合 (ファイル システムのファイル サイズの知識を使用して、ファイルを 2 回トラバースするのを回避できるようにするため)、 を使用して手動でベース パーサーを再実装する必要があることですtokenPrim。ただし、パーサー コンビネーターを再実装する必要はありません。

別の方法として、ファイルを 2 回トラバースし、行数 (最初のトラバーサルで計算) を使用して、どこまで到達したかを見積もることもできます。

于 2012-12-07T13:46:18.543 に答える