Java: Как работать с большими коллекциями? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть проект, где нужно измерить время некоторых операций с 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;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...