Java8 извлекает данные и сохраняет в hashmap, проблема с производительностью - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть список из 637200 роллидов, которые я использую для циклического перебора, получения их из таблицы DynamodB и попытки сохранить его в hashmap.Я пытаюсь добавить это в пользовательский ForkJoinPool около 8 Threads

HashMap<String, List<Details>> studentRecord = new HashMap<>();
        rollIds.parallelStream(id -> {
            Details d = fetchDataStudentDao.getStudentById(id);
            studentRecord.put(id, d);
        });

Примечание: я не могу контролировать getStudentById, как это происходит из какого-то другого пакета, который яне должен изменяться.

У меня проблемы с использованием параллельных потоков, потому что отображение не происходит правильно.Ученик с одним id сопоставляется с некоторыми другими данными ученика.

Проверяя больше этого, я обнаружил, что HashMap не является поточно-ориентированным и не должен использоваться вместо этого, мы используем concurrentHashMap или используем forEach.

Если я использую forEach, получение результата занимает более 4 часов.но если я использую parallelStreams, это займет около 3 часов немного быстрее, чем forEach, но результат будет неправильным.

Проблемы, с которыми я сталкиваюсь, какое решение мне следует использовать?Я не уверен, как использовать ConcurrentHashmap в этом случае, и будет ли он быстрее?

Или каким-либо другим способом это можно сделать быстрее, требуя некоторой помощи и руководства.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

попробуйте этот код вместо

Map<String, Details> studentRecords = rollIds.parallelStream()
          .collect(Collectors.toMap(Functions.identity(), id -> fetchDataStudentDao.getStudentById(id)));
0 голосов
/ 24 февраля 2019

Ваш пут (id, d) помещает только одну деталь, а не список деталей.

...