Hi Leute,
Java gibt mir derzeit immer mehr rätsel auf da ich mit grassen mengen an daten
hantiere und sehr auf speicherverbrauch geachtet werden muss...
daher wollte ich mir eine arraylist implementieren...
ich verwende ein 2 dimensionales array mit jeweils 1M Integern in der 2. dimension
=>sollte jeweils 4mb kosten....warum kommt folgender code nicht mit 400Mb und auch nicht
mit 450 mb arbeitsspeicher aus?
wenn mir das einer erklärt wäre ich glücklich ;-)
Java gibt mir derzeit immer mehr rätsel auf da ich mit grassen mengen an daten
hantiere und sehr auf speicherverbrauch geachtet werden muss...
daher wollte ich mir eine arraylist implementieren...
ich verwende ein 2 dimensionales array mit jeweils 1M Integern in der 2. dimension
=>sollte jeweils 4mb kosten....warum kommt folgender code nicht mit 400Mb und auch nicht
mit 450 mb arbeitsspeicher aus?
wenn mir das einer erklärt wäre ich glücklich ;-)
Code:
package util;
public class ChunkedIntArrayList {
//the chunks
private int[][] data;
//position to put the next element
private int offsetI, offsetJ;
//number of elements stored in data array
private int numElements;
//number of elements that fit in data array
private int size;
//number of integers per chunk
private final int chunkSize;
public ChunkedIntArrayList(int chunkSize) {
this.chunkSize = chunkSize;
data = new int[1][chunkSize];
offsetI = 0;
offsetJ = 0;
numElements = 0;
}
public void add(int val) {
if(offsetJ == chunkSize) {
addChunk();
offsetI++;
offsetJ = 0;
}
data[offsetI][offsetJ++] = val;
numElements++;
}
public int get(int idx) {
int i = idx / chunkSize;
int j = idx % chunkSize;
return data[i][j];
}
public void set(int idx, int val) {
int i = idx / chunkSize;
int j = idx % chunkSize;
data[i][j] = val;
}
public int size() {
return numElements;
}
private void addChunk(){
System.out.println("addChunk "+data.length + " " + numElements);
int[][] tmp = new int[data.length + 1][];
for(int i=0;i<data.length;i++) {
tmp[i] = data[i];
}
tmp[tmp.length - 1] = new int[chunkSize];
data = tmp;
size = chunkSize * data.length;
}
public static void main(String[] args) throws InterruptedException{
int size = 100000001;
ChunkedIntArrayList list = new ChunkedIntArrayList(1000000);
System.out.println("add");
for(int i=0;i<size;i++){
list.add(i);
}
System.out.println("add");
for(int i=0;i<size;i++){
list.set(i, i+1);
}
System.out.println("get");
for(int i=0;i<list.size;i++){
// System.out.println(list.get(i));
}
Thread.sleep(10000);
}
}