У меня есть проект, где нужно измерить время некоторых операций с 3 типами коллекций. Проблема в размере коллекций. Максимальный размер коллекций должен быть 10'000'000, и все операции должны измеряться одновременно.
Если я запускаю операции последовательно, все работают нормально, но веха параллельна. App cra sh с "OutOfMemoryError, брошенным при попытке выбросить OutOfMemoryError"
Также я установил android:largeHeap="true"
в манифесте
У меня было много попыток, вот некоторые из них:
private void measureCollections(ArrayList<String> key, String size){
Flowable.fromIterable(keys)
.parallel()
.runOn(Schedulers.computation())
.map(key -> workPlease(key, size))
.sequential()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(map -> timeValueSubject.onNext(map));
}
private Map<String, Long> workPlease(String key, String collectionSize) {
int size = Integer.parseInt(collectionSize);
int data = size / 2;
List<Integer> list;
if (key.contains(ARRAY)) {
list = new ArrayList<>(Collections.nCopies(size, data));
} else if (key.contains(LINKED)) {
list = new LinkedList<>(Collections.nCopies(size, data));
} else {
list = new CopyOnWriteArrayList<>(Collections.nCopies(size, data));
}
long startTime = System.currentTimeMillis();
if (key.contains("addToBeginning"))
list.add(0, data);
else if (key.contains("addToMiddle"))
list.add(size / 2, data);
else if (key.contains("addToEnd"))
list.add(data);
else if (key.contains("searchByValue"))
list.indexOf(data);
else if (key.contains("removeInBeginning"))
list.remove(0);
else if (key.contains("removeInMiddle"))
list.remove(size / 2);
else
list.remove(size - 1);
long endTime = System.currentTimeMillis();
long value = endTime - startTime;
Map<String, Long> map = saveAndMapData(key, value);
return map;
}