Този въпрос се отнася до най-новата версия на Java.
30 нишки на производителя избутват низове към абстрактна опашка. Една записваща нишка изскача от същата опашка и записва низа във файл, който се намира на 5400 rpm HDD RAID масив. Данните се изпращат със скорост от приблизително 111 MBps и се изваждат/записват със скорост от приблизително 80MBps. Програмата живее 5600 секунди, достатъчно, за да се натрупат около 176 GB данни в опашката. От друга страна, аз съм ограничен до общо 64 GB основна памет.
Въпросът ми е: Какъв тип опашка да използвам?
Ето какво съм пробвал досега.
1) ArrayBlockingQueue
. Проблемът с тази ограничена опашка е, че независимо от първоначалния размер на масива, винаги се оказвам с проблеми с жизнеността веднага щом се запълни. Всъщност, няколко секунди след стартирането на програмата, top
отчита само една активна нишка. Профилирането разкрива, че средно нишките производители прекарват по-голямата част от времето си в чакане опашката да се освободи. Това е независимо от това дали използвам или не политиката за справедлив достъп (с втория аргумент в конструктора, зададен на true).
2) ConcurrentLinkedQueue
. Що се отнася до жизнеността, тази неограничена опашка се представя по-добре. Докато не ми свърши паметта, след около седемстотин секунди, всичките тридесет нишки на производителя са активни. След като премина лимита от 64 GB обаче, нещата стават невероятно бавни. Предполагам, че това се дължи на проблеми с страниците, въпреки че не съм правил никакви експерименти, за да докажа това.
Предвиждам два изхода от моята ситуация.
1) Купете SSD. Надяваме се, че увеличаването на I/O скоростта ще помогне.
2) Компресирайте изходящия поток преди запис във файл.
Има ли алтернатива? Пропускам ли нещо в начина, по който някоя от горните опашки е конструирана/използвана? Има ли по-умен начин да ги използвате? Книгата Java Concurrency in Practice предлага редица политики за насищане (Раздел 8.3.3) в случай, че ограничените опашки се запълват по-бързо, отколкото могат да бъдат изчерпани, но за съжаление нито една от тях --- прекъсва, извикващият се изпълнява и двете отхвърлят политики --- се прилагат в моя сценарий.