#java #java-stream
#java #java-stream
Вопрос:
Я пытаюсь прочитать содержимое файла с параллельным потоком, и мне нужно знать номер каждой строки, возможно ли это? Я видел другие сообщения, связанные с вычислением индекса, повторяющегося по потоку, но они не используют параллельные потоки.
try (Stream<String> stream = Files.lines(myFile, myCharset).parallel()) {
stream.forEach(line -> {
// calculate index
});
} catch (IOException e) {
// handle exception
}
Спасибо.
Комментарии:
1. Вы хотите только параллельно читать строки и просто отображать их или обрабатывать их в параллельном потоке? Потому что, если вы хотите обрабатывать их параллельно, используя forEach, тогда есть способ сделать это, но подразумевает некоторый код параллелизма.
2. Этот код параллелизма в значительной степени противоречит преимуществам параллельного потока, не так ли?
3. Что вы собираетесь делать с этим номером строки?
4. Программа, которую я пишу, анализирует содержимое огромного файла (2 ГБ) и записывает в базу данных номер строки, содержащей ошибку, и результаты проверки. Параллельно это занимает около 20 минут, в противном случае это занимает до 1 часа.
5. Затем, предполагая, что количество ошибок значительно меньше, чем строк, вы можете написать пользовательскую
Collector
операцию. Важным моментом является то, что фактический номер строки не будет доступен во время параллельной обработки, но будет в конце при сборке окончательного списка ошибок. После этого они могут быть переданы в базу данных. Если это невозможно, вы можете перенести ошибки во время обработки, когда база данных позволяет исправить номера строк при последующем обновлении.
Ответ №1:
Нет, это невозможно. Параллельный поток означает, что все элементы потока обрабатываются параллельно. Чтобы получить индекс, вам понадобится последовательный поток.
Кроме того, этот метод имеет неизвестное количество строк, поэтому их параллельная обработка, скорее всего, не дает никакой производительности, кроме проблемы с индексом.