Параллельная сортировка в Java 8 и параллельная сортировка в Scala

Итак, я только что изучал новую Java 8, особенно лямбды и дату и время api. Сравнивал со scala. Моя основная идея заключалась в том, чтобы найти разницу во времени выполнения между императивным, потоковым и параллельным потоком. Поэтому я решил создать приложение «Библиотека» и выполнить некоторые операции, такие как поиск, фильтрация, сортировка и т. Д. Я создал класс библиотеки с полем списка под названием книги и заполнил его 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 только, и он просто делегирует _ 3_: 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 only Попробуйте эту ссылку: GitHub.Com/Scala/Scala/blob/master/src/library/scala/collection/…

person Saurav    schedule 27.07.2015