Что такое эффективный способ для многопоточного приложения Java, где многие потоки должны читать один и тот же файл (размером> 1 ГБ) и выставлять его как входной поток? Я заметил, что если есть много потоков (> 32), система начинает бороться с I/O и ожидает много ожидающих операций ввода-вывода.Java многопоточность чтения одного большого файла
Я рассмотрел загрузку файла в массив байтов, общий для всех потоков - каждый поток создавал ByteArrayInputStream, но выделение массива в 1 Гбайт просто не будет работать.
Я также рассмотрел использование одного FileChannel и каждого потока, создающего InputStream поверх него с помощью Channels.newInputStream(), однако, похоже, что FileChannel поддерживает состояние InputStream.
Нужно ли каждому потоку все содержимое файла? Или каждый может обратиться к соответствующим данным, которые ему нужны? –
Каждый поток должен читать весь файл. – bob
Система имеет 8 гб памяти, и я бы не прочь выделить массив 1 ГБ. Но JVM просто не похоже на это - он использует 100% процессор, пытаясь выделить массив в течение очень долгого времени. – bob