8

言語にもよりますが、最大 120,000 個の自然言語単語の大規模な辞書を保存する必要があります。プロファイリングにより、配列を使用するアルゴリズムがシステムの時間のボトルネックであることが示されているため、これらはメモリに保持する必要があります。(詳細は重要ではありませんが、これは基本的にスペルチェック/自動修正アルゴリズムです。) 16MB メモリを搭載した Android デバイスでは、Java に関連するメモリ オーバーヘッドStringにより、領域が不足します。Stringそれぞれに38 バイトのオーバーヘッドが関連付けられていることに注意してください。これにより、最大 5MB のオーバーヘッドが発生します。

一見すると、1 つのオプションは を置き換えるchar[]ことですString。(またはbyte[]、この場合は UTF-8 の方がコンパクトであるためです。) しかし、ここでもメモリ オーバーヘッドが問題になります。各 Java 配列には 32 バイトのオーバーヘッドがあります

などの代替手段の 1 つは、すべての文字列を 1 つの巨大な文字列 (たとえば単一の として表される) に内部的に連結し、オフセットをその巨大な文字列に格納する、ArrayList<String>ほとんど同じインターフェイスを持つクラスを作成することです。byte[]各オフセットは 4 バイトを使用するため、よりスペース効率の高いソリューションが得られます。

私の質問は、a) 同様に低いオーバーヘッド*で問題を解決する他の解決策はありますか? b) すぐに利用できる解決策はありますか? Guavatrove 、およびPCJコレクション ライブラリを検索しても、何も得られません。

*オーバーヘッドを 4 バイト未満に抑えることができることはわかっていますが、効果は減少しています。

注意。HotSpot JVM で削除される圧縮文字列のサポート? JVMオプションはここでは役に立たないことを示唆してい-XX:+UseCompressedStringsます。

4

1 に答える 1

0

クラスプロジェクト用の単語辞書を作成する必要がありました。データ構造としてトライを使用することになりました。配列リストとトライのサイズの違いはわかりませんが、パフォーマンスははるかに優れています。

役立つリソースをいくつか紹介します。

https://en.wikipedia.org/wiki/Trie

https://www.topcoder.com/community/data-science/data-science-tutorials/using-tries/

于 2015-06-29T19:38:13.147 に答える