2013-02-27 4 views
7

У меня есть 8 файлов. Каждый из них составляет около 1,7 ГБ. Я читаю эти файлы в байтовый массив, и эта операция выполняется достаточно быстро.BufferedReader в многоядерной среде

Каждый файл читаться следующим образом:

BufferedReader br=new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data))); 

При обработке с использованием одного ядра в последовательном смысле занимает Abour 60 секунд. Однако при распределении вычислений по 8 отдельным ядрам требуется гораздо больше 60 секунд на файл.

Поскольку все данные хранятся в памяти и не выполняются операции ввода-вывода, я предположил бы, что для обработки одного файла на ядро ​​требуется не более 60 секунд. Таким образом, всего 8 файлов должны пройти чуть более 60 секунд, но это не так.

Я что-то пропустил в отношении поведения BufferedReader? или любого из читателей, используемых в вышеуказанном коде.

Это может стоит упомянуть, что я использую этот код для первой загрузки файлов:

byte[] content=org.apache.commons.io.FileUtils.readFileToByteArray(new File(filePath)); 

Код по всем выглядит следующим образом:

For each file 
read the file into a byte[] 
add the byte[] to a list 
end For 
For each item in the list 
create a thread and pass a byte[] to it 
end For 
+0

Сколько дисковых накопителей распространяется на файлы? Или все они хранятся на одном диске? –

+2

Для таких больших файлов я настоятельно рекомендую использовать NIO. Пожалуйста, проверьте эту статью: http://www.javalobby.org/java/forums/t17036.html, может быть полезно – n1ckolas

+0

Файлы хранятся в памяти в байте []. дисковые накопители здесь не актуальны. @RJRyV – DotNet

ответ

3

Как вы на самом деле «распределение вычислений «? Есть ли синхронизация? Вы просто создаете 8 потоков для чтения 8 файлов?

На какой платформе вы работаете (linux, windows и т. Д.)? Я видел, казалось бы, странное поведение от планировщика окон до того, как он перемещает один процесс от ядра к ядру, чтобы попытаться сбалансировать нагрузку между ядрами. Это в конечном итоге привело к более низкой производительности, чем просто возможность использования одного ядра больше, чем остальное.

+0

Проблема была связана с синхронизацией между объектами. Спасибо Brett. – DotNet

2

Сколько памяти занимает ваша система?

8 x 1.7GB, + служебная информация операционной системы, может означать, что виртуальная память/пейджинг должны вступить в игру. Это, очевидно, намного медленнее, чем оперативная память.

Я ценю, что вы говорите, что каждый файл находится в памяти, но на самом деле у вас на самом деле имеется 16 ГБ свободной оперативной памяти или есть ли что-то большее на абстрактном уровне?

Если переключатель контекста также должен постоянно переключаться на страницы, это объясняет увеличение времени.

+0

Спасибо за ваш ответ. У меня достаточно памяти для размещения данных. При этом не используется пейджинг или использование виртуальной памяти. – DotNet