Preonがあなたが言及したすべての懸念に対処するかどうか、またどのように対処するかを説明させてください。
Java で大きなバイナリ ファイル (メモリより大きい) を解析 (および変換して書き込む) する必要があります。
それがまさにPreon が作成された理由です。ファイル全体をメモリにロードせずに、ファイル全体を処理できるようにする必要があります。それでも、プログラム モデルは、完全にメモリ内にあるように見えるデータ構造へのポインターを提供します。ただし、Preon は可能な限り遅延してデータをロードしようとします。
それが何を意味するかを説明するために、データ構造のどこかに、一定サイズのバイナリ表現でエンコードされたもののコレクションがあると想像してください。すべての要素が 20 バイトでエンコードされるとします。次に、Preon はまずそのコレクションをメモリにまったくロードしません。そのコレクションを超えてデータを取得する場合、エンコードされた表現のその領域にはまったく触れません。ただし、そのコレクションの 300 番目の要素を選択すると、(300 番目の要素までのすべての要素をデコードする代わりに) その要素のオフセットが計算され、すぐにそこにジャンプします。
外部からは、完全に入力されたリストへの参照があるかのようです。内部からは、要求された場合にのみ、リストの要素を取得するために外に出ます。(そして、Preon に別のことをするように指示しない限り、すぐにそれを忘れてください。)
また、単一のスレッドでできるだけ効率的に行う必要があります。
効率的とはどういう意味かわかりません。これは、メモリ消費に関して効率的であること、またはディスク IO に関して効率的であることを意味する可能性があります。Preon が目指しているのは、簡単なプログラミング モデル、メモリの使用、およびその他の多くの懸念の間でバランスを取ることを目指していると言っても過言ではありません。すべてのデータを順番にトラバースする必要がある場合は、計算リソースの面でより効率的な方法があるかもしれませんが、それは「プログラミングの容易さ」を犠牲にすることになると思います。
最後に、読み取られる形式は非常に構造化されているため、(コードが複雑な仕様に近くなるように) ある種のパーサー ライブラリがあるとよいでしょう。
私が Java バイト コードのサポートを実装した方法は、バイト コードの仕様を読み、そこに記載されているすべての構造を、アノテーションを使用して Java クラスに直接マップすることです。プレオンはあなたが探しているものにかなり近いと思います.
preon-emitter をチェックアウトすることもできます。これにより、データの注釈付き 16 進ダンプ (この Java クラス ファイルの 16 進ダンプの例など) を生成できるため、他のライブラリでは見られなかった機能です。 . (ヒント: 16 進数の上にマウスを置いてください。)
同じことが生成されるドキュメントにも当てはまります。その目的は常に、ウィキペディアに投稿できるドキュメントを確実に作成することでした。まだ完璧ではないかもしれませんが、現在の機能に不満はありません。(例:これは、Java のクラス ファイル仕様用に生成されたドキュメントです。)
それが重要な場合、解析に必要な先読みの量は少なくする必要があります。
うん。いいよ。実際、それは Preon にとっても不可欠です。Preon は先読みをサポートしていません。ただし、振り返りをサポートします。(つまり、エンコーディング メカニズムの一部が、以前に読み取られたデータによって駆動される場合があります。Preon では、以前に読み取られたデータを指す依存関係を宣言できます。)
バイナリ データ用の適切なパーサー ライブラリはありますか?
プレオン!;-)
パーサーはストリーミング変換をどの程度サポートしていますか (解析中に解析対象のデータを何らかの出力にストリーミングできるようにしたい - 書き出す前にメモリ内に解析ツリー全体を構築する必要はありません)?
上で概説したように、Preon は処理を開始する前にデータ構造全体をメモリ内に構築しません。そういう意味では、あなたは優秀です。ただし、Preon にはファーストクラスの市民として変換をサポートするものは何もなく、エンコーディングのサポートは制限されています。
nio については、おそらくディスクが制限されている可能性が高いため、nio はあまり役に立たないのではないかと疑っています (単一のスレッドであるため、単純にブロックしても損失はありません)。また、io ベースのパーサーの方が一般的だと思います。
Preon は NIO を使用しますが、メモリ マップ ファイルのサポートのみです。