Добавление элементов в список происходит слишком медленно - PullRequest
0 голосов
/ 06 марта 2019

У меня есть этот цикл:

List<Integer> numbers = new ArrayList<Integer>();
 for(int x=0; x<citiesNames.size();x++){
            List<Cities> numeroCiudades = citiesRepository.findByCity(citiesNames.get(x));
            numbers.add(numeroCiudades.size());
            //System.out.println(numeroCiudades.size());
        }

где townsNames - это список строк, который содержит 16584 элемента, а findByCity - метод, в котором я передаю строку и выполняю поиск в базе данных соответствующих записей.Что я хочу сделать, так это искать соответствующие записи в каждом городе, проверять количество записей и добавлять количество записей в список целых чисел.Но этот цикл слишком медленный, он требует очень много времени, чтобы показать результат.Как я могу оптимизировать это?

Ответы [ 3 ]

1 голос
/ 07 марта 2019

Я не совсем понимаю, почему вы должны "упаковать" все города в Список, когда вы можете создать функцию в репозитории townsRepository, которая возвращает целое число с количеством записей, которые есть у конкретного города.(Это значительно увеличило бы производительность. Таким образом, программа могла бы просто возвращать простое int вместо создания целого класса).заранее настроить емкость списка.Изменение размера большого списка может привести к значительному снижению производительности (подробнее о том, как работает ArrayList здесь )

0 голосов
/ 07 марта 2019

Чтобы оптимизировать этот цикл, вам нужно изменить findByCity, чтобы он мог обрабатывать все сразу. Если вы не можете изменить findByCity, вы всегда можете использовать параллелизм с потоками:

    int numbers[] = citiesNames.parallelStream()
            .mapToInt(c -> citiesRepository.findByCity(c).size())
            .toArray();
0 голосов
/ 07 марта 2019

Вы можете использовать параллельный поток, предполагая, что citiesName - это обычный тип коллекций Java:

citiesName.parallelStream()
          .map(citiesRepository::findByCity)
          .collect(Collectors.toList())

Просто остерегайтесь подводных камней параллельного потока и как он использует общий ForkJoinPool.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...