Java 8 паралелно сортиране срещу паралелно сортиране на Scala

Така че тъкмо изучавах нова Java 8, специално ламбда и API за дата и час. Сравнявах го със scala. Основната ми идея беше да намеря разликата във времето за изпълнение между императив, поток и паралелен поток. Затова реших да създам приложение Library и да извърша някои операции като търсене, филтриране, сортиране и т.н. Създадох клас Library с поле за списък, наречено books, и го попълних с 1000 книги. След това създаде функционален интерфейс за търсене и извърши някои операции и в трите стила. Всичко работи добре. Моят код е:

// Functional Interface
interface Search<T> {
    public void search(T t);
}

// Library class
final Library library = new Library();
// This just creates some random book objects.
final List<Book> books = collectBooks();

final Search<List<Book>> parallelSearch = (bks) -> library.findAndPrintBooksParallel(bks);

// Parallel Operations
private void findAndPrintBooksParallel(List<Book> books) {
    books.parallelStream()
        .filter(b -> b.getAuthor().equals("J.K. Rowling"))
        .sorted((x,y) -> x.getAuthor().compareTo(y.getAuthor()))
        .map(Book::getIsbn)
        .forEach(Library::waitAndPrintRecord);
}

Сега се опитах да създам отново същата програма в scala и да видя дали изпълнението е по-бързо или не? Изненадващо scala не ми позволи да направя паралелно сортиране (или може би съм невеж тук). Моята библиотека на scala е

// Again some random book objects as a list
val books = collectBooks

// Parallel operation
books.par filter(_.author == "J.K. Rowling") map (_.isdn) foreach waitAndPrint

Тук books.par дава ParSeq. Това няма метод за сортиране. Има ли някакъв начин да създам паралелно сортиране с моя списък с книги в scala. Така че мога да напиша нещо като:

books.par filter(_.author == "J.K. Rowling") sortWith (_.author < _.author) map (_.isdn) foreach waitAndPrint

Вашата помощ е много ценена. Благодаря.


person Syam S    schedule 02.05.2014    source източник
comment
sorted се предоставя от scala.collection.SeqLike само и просто делегира на java.util.Arrays.sort(T[] a, Comparator<? super T> c): GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/ Така че самото сортиране никога няма да бъде паралелно, а само преобразуването към и от Java масива може.   -  person Jörg W Mittag    schedule 02.05.2014
comment
да чел съм това Чудех се дали можем да добавим метод за сортиране към ParSeq.   -  person Syam S    schedule 02.05.2014
comment
Смисълът на въпроса ви е малко неясен. Можете ли да опитате да перифразирате съдържанието си под формата на въпрос, така че хората да могат да ви насочат в правилната посока? Питате ли как да направите паралелно сортиране в Scala?   -  person Peter Mularien    schedule 02.05.2014
comment
@PeterMularien. Виждал съм много публикации за паралелно сортиране. Въпросът ми беше да създам метод за сортиране по такъв начин, че да можем да го извикаме по-сбито, вместо да предаваме обект на книги към метод за сортиране и след това да го сортираме. нещо като books.par sort   -  person Syam S    schedule 02.05.2014
comment
Може би бихте могли да направите въпроса по-ясен, като премахнете частта за функционалния интерфейс и всичко това и просто се съсредоточете върху това, което според мен е основният ви въпрос, който е - има ли някакъв начин да напишете кратка, ориентирана към последователност функция за паралелно сортиране в Scala (подобно на синтаксиса, който вече предоставяте в последния кодов блок)? Страхувам се, че основната информация, която предоставихте за Java 8, прави целта на въпроса ви малко неясна.   -  person Peter Mularien    schedule 02.05.2014
comment
Може би stackoverflow.com/questions/15589502/ и gist.github.com/atla/306844 са добри отправни точки   -  person TheConstructor    schedule 28.08.2014
comment
stackoverflow.com/questions/7549795/ моля, намерете входове от тази връзка   -  person Ranjithkumar    schedule 21.09.2014


Отговори (2)


Човек може да приложи паралелно сортиране в scala, напр. http://blog.yunglinho.com/blog/2013/03/19/parallel-external-merge-sort/ . Не знам защо ParSeq не предлага сортиране в своя API. Имайте предвид, че има редица алтернативи на .par, така че не приемайте непременно, че вашите резултати от ParSeq са представителни за паралелизма на Scala като цяло. (Но бенчмарковете са ценни и ви желая успех с вашите).

person lmm    schedule 24.09.2014

аз съм много нов в scala, но доколкото разбирам, самото сортиране никога няма да бъде паралелно, само преобразуването към и от Java масива може. sorted се предоставя от scala.collection.SeqLike само Опитайте тази връзка: GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/…

person Saurav    schedule 27.07.2015