8

新しいコピーを作成せずに非常に大きな配列をスライスするための解決策/回避策を見つけようとしています。これが私の問題です。

サイズが 1 億以上の double/int の大きな配列があるとします。メモリ使用量を大幅に節約するために、さまざまなものを表すさまざまな配列を 1 つの非常に大きな配列に格納しています。したがって、サイズ 100 の配列を 100 万個持つ代わりに、サイズ 1 億の単一の配列を使用します。データを追跡するためにインデックス (開始と停止) を保存します。

サイズ 100 のスライスを何千も取得したいと考えています。メソッド Arrays.copyOfRange() を使用してスライスを取得すると、すべてを 1 つの大きな配列に入れるという目的が無効になります。各スライスはメモリを消費する新しいコピーだからです。

独自のデータ (より小さな配列) で動作するレガシー コード (長年にわたって多くの人々によって書かれた 100 万行を超えるコード) があります。大きな配列のインデックス (begin、end) を操作するように既存のコードを変更することはできません。

インデックス 0 が元の大きな配列の任意のインデックスである参照 (またはそのふりをする) が返されるように元の配列を返すことができれば、それは素晴らしいことです。

C/C++ では、呼び出し元のコードが機能する特定のオフセットと長さを持つポインターを簡単に返すことができます。

Java でのオプションは何ですか?

編集:次の同様の質問を見ましたが、質問への回答が含まれていません。 データをコピーせずに、Javaで配列のサブ配列を取得する方法は?

4

4 に答える 4

3

int 値の配列の場合は、IntBuffer. 配列のスライスをラップすることもできます。

int[] largeArray = . . .

// create a slice containing the elements 100 through 149 (50 elements):
IntBuffer slice = IntBuffer.wrap(largeArray, 100, 50);
于 2013-03-22T19:38:11.213 に答える
2

元の配列と開始インデックスへの参照を保持するラッパー クラスを作成し、このラッパーのインスタンスを使用して元の配列にアクセスするのはどうでしょうか。

以下のコードは構文的に正しくないかもしれませんが、アイデアは得られるはずです。

public class ArraySlice(){
  private int startIndex;
  private int[] originalArray;
  //getters-setters

  public ArraySlice(int[] originalArray, int startIndex){
    //Initialize
  }

  public int get(int index){
    return originalArray[startIndex+index]
  }
}
于 2015-03-27T08:34:08.230 に答える
1

最適なオプションは、スライスのインデックスを別の構造 (インデックスを格納する配列など) に格納することです。

このようにして、データ配列全体のパーティションである大きな配列をインスタンス化することはありません。

于 2013-03-22T19:37:59.773 に答える
1

インデックス、サイズ、および元の配列への参照を格納する独自のオブジェクトを作成できますか?

class CustomizedArray {
  int startIndex;
  int size;
  int[] originalArray;

  public CustomizedArray(int startIndex, int size, int[] originalArray) {
    this.startIndex = startIndex;
    this.size = size;
    this.originalArray = originalArray;
   }

   public int getIndex(int index) {
     int originalIndex = startIndex+index;
     if(index <0 || originalIndex >= startIndex+size) {
        throw new IndexOutOfBoundException();
     }
     return originalArray[originalIndex];


}

次に、 CustomizedArray をより大きな構造に格納できます。

于 2015-03-27T08:31:53.380 に答える