У меня есть следующий фрагмент кода, где я читаю большой файл, используя объект stringBuffer, выполняя некоторые операции, создавая временные объекты byte [], и из-за этого я получаю исключение нехватки памяти, когда файл имеет большой размер скажем 16 мб.
StringBuffer dataBuffer;
ArrayList<byte[]> sourceFragments;
ArrayList<BitSet> sourceBits = new ArrayList<BitSet>();
dataBuffer = eHelper.readFile(encoder.getFileName());
sourceFragments = eHelper.fragmentFile(dataBuffer.toString());
/*
* converting byte[] to BitSet
the below loop is run 128 times
*/
Iterator<byte[]> iter = sourceFragments.iterator();
while (iter.hasNext()) {
byte[] temp = iter.next();
// temp.length will return 128 KB
sourceBits.add(eHelper.byteArrayToBitSet(temp));
}
Я удивляюсь, если для меня есть способ предотвратить возникновение этого исключения из памяти. Я не рассматриваю возможность увеличения пространства кучи, я использую пространство кучи по умолчанию на 32-разрядной машине. Можно ли как-нибудь уменьшить количество создаваемых временных объектов, чтобы избежать исключения outOfMemory
edit1:
Я сделал следующие изменения в коде, где я не загружаю весь файл в память в виде строки, я не создаю массив byte [], но читаю непосредственно из файла и преобразую его непосредственно в массив arrayList из BITSET. Это немного помогло, когда я могу работать с 20 МБ файлами, мне интересно, можно ли еще продвинуть это для работы с макс. 30 МБ файлами?
edit2:
Я изменил исходный код следующим образом: я удалил все избыточные типы данных, которые я создал
public ArrayList фрагментSourceData (имя файла файла) {
RandomAccessFile r;
ArrayList sourceBits = new ArrayList ();
try {
r= new RandomAccessFile(filename, "r");
System.out.println(r.length());
encoder.setSourceFileLength((int)r.length());
int fragmentSize = encoder.calculateFragmentSize();
System.out.println(fragmentSize);
encoder.setFragmentSize(fragmentSize);
encoder.setParameters();
byte[] b = new byte[fragmentSize] ;
long new_pos=0;
int i=0;
while(new_pos<=encoder.getSourceFileLength()){
i++;
r.read(b ,0, fragmentSize );
new_pos=fragmentSize*i;
r.seek(new_pos);
sourceBits.add(BitSet.valueOf(b));
}
r.close();
b=null;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sourceBits;
}
}