J2ME を使用して大量のデータを保存するためのベスト プラクティス

StackOverflow https://stackoverflow.com/questions/19011

  •  09-06-2019
  •  | 
  •  

質問

デバイスに保存する大量のデータ (1MB 程度ですが変動します) を含む J2ME アプリケーションを開発しています。ファイル システムに頼ることができないので、複数のレコード ストアを許可するレコード管理システム (RMS) を利用していますが、それぞれのサイズには制限があります。私の最初のターゲット プラットフォームである Blackberry では、それぞれが 64 KB に制限されています。

RMS に大量のデータを保存するという問題に取り組まなければならなかった人が他にいるだろうか、また、それをどのように管理したのか気になります。レコード サイズを計算し、1 つのデータ セットが大きすぎる場合は複数のストアに分割する必要があると考えていますが、それを維持するにはかなりの複雑さが追加されます。

さまざまな種類のデータが多数保存されていますが、64 KB の制限を超えるのは特に 1 つのセットだけです。

役に立ちましたか?

解決

数キロバイトを超える場合は、JSR 75 またはリモート サーバーを使用する必要があります。RMS レコードは、一部のハイエンド端末であっても、サイズと速度が非常に制限されています。J2ME で 1MB のデータを処理する必要がある場合、信頼性が高く移植可能な唯一の方法は、データをネットワーク上に保存することです。HttpConnection クラスと GET メソッドと POST メソッドは常にサポートされます。

JSR 75 FileConnection をサポートするハンドセットでは、これは有効な代替手段になる可能性がありますが、コード署名がなければ、ユーザー エクスペリエンスは悪夢になります。ほぼすべての API 呼び出しで、包括的な権限の選択肢がないセキュリティ プロンプトが呼び出されます。JSR 75 を使用してアプリをデプロイする企業は、通常、使用可能な証明書のごく一部をカバーするだけで、ポートごとに 6 個のバイナリが必要になります。これは製造元の証明書のみに適用されます。一部の携帯電話機には、キャリアロックされた証明書しかありません。

他のヒント

RMS のパフォーマンスと実装はデバイス間で大きく異なるため、プラットフォームの移植性に問題がある場合、コードが一部のデバイスでは正常に動作し、他のデバイスでは動作しない場合があります。RMS は、大量のデータではなく、少量のデータ (高スコア テーブルなど) を保存するように設計されています。

一部のプラットフォームでは、ファイルを複数のレコード ストアに保存すると高速になる場合があります。1 つのストア内で複数のレコードを使用すると高速になるものもあります。多くはストレージとしては問題ありませんが、ストアから大量のデータを削除すると、使用できないほど遅くなります。

最善の策は、利用可能な場合は代わりに JSR-75 を使用し、これ以上のものがサポートされていない場合は RMS にフォールバックする独自のファイル ストア インターフェイスを作成することです。

残念ながら、JavaME に関しては、デバイス固有のコードのバリアントを記述することになることがよくあります。

最も柔軟なアプローチは、RMS 上に独自のファイル システムを実装することだと思います。RMS レコードはハード ドライブ上のブロックと同様の方法で処理でき、 i ノード構造 または、論理ファイルを複数のブロックに分散する場合と同様です。ブロックの上にバイトまたはストリーム指向のインターフェイスを実装し、場合によってはその上に特別なデータ構造を記述するための別の API レイヤーを作成する (または単にオブジェクトをデータ ストリームにシリアル化できるようにする) ことをお勧めします。

タネンバウムのオペレーティング システムに関する古典的な本 では、単純なファイル システムの実装方法について説明していますが、紙が好きでない場合は、オンラインで他のリソースを見つけることができると思います。

Blackberry OS 4.6 では、RMS ストアのサイズ制限が 512Kb に増加しましたが、多くのデバイスは 4.6 をサポートしていない可能性があるため、これはあまり役に立ちません。Blackberry のもう 1 つのオプションは永続ストアです。これには、レコード サイズの制限が 64 kb ありますが、ストアのサイズには制限がありません (デバイスの物理的な制限を除く)。

カルロスとizbは正しいと思います。

これは非常に簡単です。JSR75 (FileConnection) を使用し、有効な (信頼できる) 証明書でミッドレットに署名することを忘れないでください。

読み取り専用の場合、リソース ファイルのインデックスを作成することで、許容可能な時間 (10 秒以内) で到着します。約 800KB の CSV 価格表を 2 つエクスポートしました。プログラム クラスとこれらのファイルは両方とも 300KB JAR に圧縮されます。

検索すると、 List そして2を実行します Threadがバックグラウンドで入力されるため、最初の結果はすぐに表示され、すぐに表示されます。最初に単純な線形検索を実装しましたが、それは遅すぎました (約 2 分)。

次に、ファイル (アルファベット順にソートされている) にインデックスを付けて、各文字の先頭を見つけました。一行ずつ解析する前に、まず InputStreamReader.skip() 最初の文字に基づいて、希望の位置に移動します。遅延の主な原因はリソースの解凍にあると思われるため、リソースを分割するとさらに速度が向上するでしょう。簡単にアップグレードできるという利点を失いたくないので、そんなことはしたくありません。CSV は前処理なしでエクスポートされます。

私は JavaME のコードを書き始めたばかりですが、古いバージョンの PalmOS の経験があります。このバージョンでは、すべてのデータ チャンクのサイズが制限されており、レコード インデックスとオフセットを使用したデータ構造の設計が必要です。

皆さん、有益なコメントをありがとうございました。最終的に最も簡単な解決策は、保存されるデータの量を制限し、ストアの規模に応じてデータを調整するコードを実装し、ローカルに保存されていない場合はオンデマンドでサーバーからデータを取得することでした。OS 4.6 では制限が増加しているのは興味深いですね。運が良ければ、私のコードは単に独自に調整して、より多くのデータを保存するでしょう :)

.cod コンパイラを使用せずに Blackberry 用の J2ME アプリケーションを開発すると、アーカイブに署名できないため、JSR 75 の使用がある程度制限されます。Carlos が指摘したように、これはどのプラットフォームでも問題であり、その PIM 部分を使用して同様の問題が発生しました。RMS は Blackberry プラットフォームでは信じられないほど遅いようです。そのため、データがメモリにキャッシュされ、優先度の低いバックグラウンド スレッドで RMS に書き込まれない限り、最上位の i ノード/B ツリー ファイル システムがどれほど役立つかはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top