0

Tomcat サーバーと JavaScript クライアントで実行される Java バックエンドを使用して Web アプリケーションを作成しています。

バックエンドでは、CT スキャンの情報を保持する大きな int[][][] 配列を処理する必要があります。サイズは約です。1024x1024x200。

画像スライスなどの新しいデータを処理する必要がある場合にのみ、この配列をメモリにロードし、残りの時間のために何らかのデータベースに保存したいと考えています。

これまでに試したこと:

  • JDBM3 を使用して文字列、int[][][] ハッシュマップを格納すると、メモリ不足エラーが発生します

  • オブジェクトをシリアル化し、bytea[] データ型を使用して PostgreSQL-DB に保存すると、正しく保存されますが、再度読み込み中にメモリ エラーが発生します。

だから私の最初の質問は、どうすればそのような大きな配列(どのデータベース、メソッド)を保存できますか? 複数のユーザーがフロントエンドを使用して int[][][] をバックエンドにロードできるため、高速にロードする必要があり、ある種のマルチユーザー アクセス セキュリティが必要です。データベースには非商用ライセンスが必要です。GPL、MIT、アパッチ...

2 番目の質問です。シリアル化された配列をファイル システムに保存し、リンクをデータベースに保持できることはわかっていますが、複数のユーザーがアクセスしても安全ですか?

4

3 に答える 3

2

クライアント マシンに十分な RAM がある場合は、単純に JVM ヒープのサイズを増やすことから始めることができます。このようにして、「メモリ不足」エラーに遭遇することなく、より大きな配列を作成できるはずです。

配列だけで (1024 x 1024 x 200 x 32 ビット) で遊ぶには、少なくとも約 800 Mbが必要です。

于 2012-05-29T19:38:33.267 に答える
1

MemoryMappedFileはまさにこのようなものを処理するために生まれたと思います。読み取りと書き込みのランダムアクセスを使用して、ディスク上のファイルの配列のようなビューを提供します。int[][][]あなたがしなければならないことは、a の上に aを配置するスキームを開発することでbyte[]あり、それは問題にはなりません。このようにすると、配列全体をメモリに保持する必要がなくなり、実際に使用しているスライスだけを作成できます。すべてのスライスを反復処理する必要がある場合でも、一度に 1 つのスライスしかインスタンス化できません。

于 2012-05-29T20:17:27.867 に答える
0

CAT-Scan の場合、ピクセルは 256 色のグレースケールですか? その場合、データを int 配列ではなくバイト配列として保存することで、大量のメモリを節約できます。64K グレースケールの場合は、int ではなく short を使用します。

于 2012-05-29T19:44:12.433 に答える