2011-09-12 5 views
0

古い世代のiPhone(ipod touch 1 gen、2nd gen e.t.c)のメモリに問題があります。これは、170kワードの辞書をロードして保存するときに割り当てられるメモリ容量に起因します。メモリ効率的かつ迅速なiPhone/Androidの辞書ストレージ/アクセス

これはコード(非常に単純な)です:

string[] words = dictionaryRef.text.Split("\n"[0]); 
_words = new List<string>(words); 

これは、ストレージの12メガバイトの周りに開始に割り当て、iphoneは私が考える43メガバイトの周りに持っています。そのため、+テクスチャ+サウンド+ OSは壊れやすい傾向があります。

速度を考えれば、バイナリ検索を使用してアクセスすることは問題ありません。しかし、それをより効率的にメモリに格納する(そして、より効率的にロードする)。

text.Splitは、ヒープメモリの多くを占めているようです。

アドバイスはありますか?

+0

\ n "[0]'とは何ですか? '\ n'だけ使うことはできませんでしたか? – jv42

+1

実際の質問:なぜ単純な配列の代わりにリストが必要ですか? – jv42

+0

平均して10文字(1バイトごとに)の平均が17万語(平均しても過大評価されている)と推定されるのは1.7MB程度です。 char配列の配列としてデータを格納するのは、それほど多くのメモリを占めるだけです。 –

答えて

0

これらの3.0より前のデバイスが起動時に使用できるメモリの量は、あまり多くカウントできません。 43 MBはかなり楽観的です。あなたのアプリはその単語がリストに入っているかどうかを確認するだけですか?バイナリ検索を使用する代わりに、独自のハッシュテーブルをロールすることができます。私は文献のいくつかを検索し、オーバーフローを積み重ねて、あなたが持っている特定の単語サイズの大きな辞書を保存する効率的な方法を探します。ハッシュテーブルのGoogle検索は、より良い実装を提供するかもしれません。

+0

リストを記憶しているメモリではなく、メモリを使用してワードに分割します。そうでなければ、検索は良いスピードです。ハッシュテーブルは、より多くのメモリ全体を使用します。 文字列を区切り文字(改行)に基づいて単語に分割するより良い方法が必要です。 – Ash

+0

バイナリツリーはメモリ内のすべてのツリーを保持する必要があるため、メモリを使い果たしています。ハッシュテーブルを使用する場合は、単語をテーブルに入れたら、バイナリ検索を行うためにすべてのノードを保持する必要はなく、場合によっては、ハッシュ検索はそれほど効率的ではありません。キーは、提案されたデータでうまく動作する良いハッシュアルゴリズムを選択することです。 –

0

SQLiteを使用します。それはより少ないメモリを使用し、より速くなります。単語列にインデックスを作成し、辞書全体をメモリにロードせずにバイナリ検索を行います。

0

最初の場合dictionaryRef.textは文字列です(それはそうそうです)、あなたは既に何か巨大な割り当てを受けています(文字あたり2バイト)。それが割り当てられている総メモリの量(半分に近い)を十分に考慮しているかどうかを確認してください。これをキャッシュすることを考えてください(データベースの考え方は良いですが、ファイルが将来の実行でFile.ReadAllLinesを使用するために行うことができます)。

次に、MonoのSplitメソッドより少し上手くやってみることができます。それはリストを作成し、最後に配列を呼び出す(ToListを呼び出す)ことで、新しいリストを作成します。あなたの要件( '/ n'のみ)はかなり基本的なものなので、自分のSplitメソッド(またはMonoからのコピー/ペースト/縮小)をロールし、一時的なメモリ割り当てを避けることをお勧めします。いずれの場合においても

は、多くの場合、我々が;-)

0

を見ていないところ、私はSQLiteのバックエンドを使用していることをモーニングスターに同意する必要があります発生し、配分するため、さらに多くの文字列の(メモリ)の測定値の多くを取りますあなたの言葉の記憶のために、あなたがしようとしていることに対する最良の解決策のように聞こえる。

あなたが単語リストを使う、という場合は、ここで提案です:dictionaryRef.textは、その全体(File.ReadAllText(でテキストファイルを読み込むことによって構築されるようですが、私には見えます

)、またはそのようないくつかの)。

TextReader.ReadLine()を使用してファイルからListに一度に1単語を読み込んで、String.Split()を使用したり、一時的な記憶領域を使用したりする必要はありません。

最終的には、とにかく欲しいものだと思われます。ReadLine()は\ nで分割します。