3

Java で大きなバイナリ ファイル (メモリより大きい) を解析 (および変換して書き込む) する必要があります。また、単一のスレッドでできるだけ効率的に行う必要があります。最後に、読み取られる形式は非常に構造化されているため、ある種のパーサー ライブラリを用意するとよいでしょう (コードが複雑な仕様に近づくようにするため)。

それが重要な場合、解析に必要な先読みの量は少なくする必要があります。

だから私の質問は:

  • シングルスレッドの大容量アプリケーションにとって、nio v io はどれほど重要ですか?

  • バイナリ データ用の適切なパーサー ライブラリはありますか?

  • パーサーはストリーミング変換をどの程度サポートしていますか (解析中に解析対象のデータを何らかの出力にストリーミングできるようにしたい - 書き出す前にメモリ内に解析ツリー全体を構築する必要はありません)?

nio については、おそらくディスクが制限されている可能性が高いため、nio はあまり役に立たないのではないかと疑っています (単一のスレッドであるため、単純にブロックしても損失はありません)。また、io ベースのパーサーの方が一般的だと思います。

4

4 に答える 4

3

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 を使用しますが、メモリ マップ ファイルのサポートのみです。

于 2012-06-29T06:20:26.450 に答える
3

NIO と IO では、あなたは正しいです。IO を使用するのが正しい選択です - 複雑さが少なく、ストリーム指向などです。

バイナリ解析ライブラリの場合 - チェックアウトPreon

于 2012-06-27T16:28:38.280 に答える
2

メモリマップファイルを使用すると、メモリを気にせずに読むことができ、高速です。

于 2012-06-27T16:30:01.233 に答える
0

NIOはリトルエンディアンをネイティブに読み取ることができるため、リトルエンディアンデータがない限り、NIOとIOの関係は正しいと思います。

高速なバイナリ パーサーについては知りません。通常は、NIO または IO を直接呼び出します。メモリ マップド ファイルは、書き込み時にフラッシュする必要がないため、単一のスレッドからの書き込みに役立ちます。(ただし、使いにくい場合があります)

好きなようにデータをストリーミングできます。問題はないと思います。

于 2012-06-27T16:31:32.887 に答える