Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 44

Как правильно работать с типом RDD (Pyspark), хранящим массив из десяти миллионов значений?

25.02.2021, 21:11. Показов 2999. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть учебная задача: в массиве чисел np.arange(1, number), где number - введенное значение, подсчитать кол-во чисел, являющихся простыми. Number, при этом, должен быть очень большим числом. Я написал для такой задачи код в обычном IDLE, но выполняется он долго. На массив значений от 1 до 10,000,000 высчитывание кол-ва простых чисел из него ведется 512 секунд. Думаю, если перейти к миллиардам - то соответственно и десяти часов не хватит это дело обработать.

Я узнал, что существует фреймворк Apache Spark, который легко подключается к Jupyter Notebook и позволяет такое дело высчитывать очень быстро. Я написал код, адаптировав его под Spark:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import findspark
findspark.init()
 
import pyspark
from pyspark import SparkContext
import numpy as np
import math
import time
 
start_time = time.time()
sc = SparkContext.getOrCreate()
 
number = int(input('Введите число '))
number_sqrt = int(number**(0.5))
print('Квадратный корень из введенного числа: ', number_sqrt)
 
def inside(a):
    
#здесь идет тело функции, опущу его, дабы не слишком нагружать экран
 
    if quantity==1:
        return True
    if quantity==0:
        return False
 
our = np.arange(1, number) 
ourRDD = sc.parallelize(our)
n = ourRDD.map(inside).filter(inside)
print(ourRDD)
print(n)
sc.stop()
print("--- %s seconds ---" % (time.time() - start_time))
Смысл в том, что если число простое, то переменная quantity == 1 и функция возвращает True. Если число составное, то переменная quantity == 0, и функция возвращает False.

Далее, переменная our заполняется np.arange(1, number)
ourRDD становится переменной типа RDD, содержащей np.arange(1, number)
Потом каждая из ячеек массива ourRDD переходит в тело основной функции, и возвращает True или False. Значения False фильтруются, и остаются только True. Получается массив из ячеек True (переменная n).

Переменные ourRDD и n, имеющие тип RDD, создались у меня за 62 секунды (я их вывел на экран в print(ourRDD) и print(n))

ParallelCollectionRDD[0] at readRDDFromFile at PythonRDD.scala:262
PythonRDD[1] at RDD at PythonRDD.scala:53
--- 63.86521315574646 seconds ---

Это неплохо. Но когда я хочу подсчитать количество ячеек в переменной n, дописывая к коду следующее:

Python
1
2
count1 = n.count()
print(count1)
То код начинает выполняться непомерно долго. Я ждал минут 15 или 20, потом просто остановил выполнение.
Вопрос в следующем.
Я знаю, что Apache Spark выполняется для научных вычислений и BigData вычислений, при этом, сами вычисления обещают выполняться весьма быстро. Соответственно, count в моем массиве с уже отобранным кол-вом True значений тоже вроде как не должен выполняться слишком долго. Может, я что-то делаю неправильно или для моей задачи Spark не применим? Или я не указал какие-то настройки, которые нужно было укзаать? Я всего лишь скачал Spark с офиц. сайта, скачал Anaconda с IDE Jupyter, и запустил его. Или мой компьютер слишком слабый и Spark использовать в нем бесполезно (я студент и работаю сейчас на ноутбуке, купленном в 2020 за 20000 рублей)?

Помогите, пожалуйста. Отблагодарю!

С уважением ко всем пользователям форума и в отдельности прочитавшему этот пост,
Виктор (пользователь vitenka95)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.02.2021, 21:11
Ответы с готовыми решениями:

Как работать с массивами более 10 миллионов значений?
Здравствуйте! Столкнулся с такой проблемой. Есть задание "В текстовом файле sort1.zip в каждой строке записано целое число в...

Как создать массив и правильно работать с потоками?
Хей. Как правильно создать массив со строками "test1", "test2", "test3" ( Гуглил, не смог понять, прошу пример ) Мне нужно проверить...

Почему System.Type является ссылочным типом, а не типом значений?
Разве может отличаться тип String, например от типа String? Если вы возьмёте typeof(String), то вы получите объект Type. Мне кажется более,...

5
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
26.02.2021, 08:08
vitenka95, зачем вам перебирать все числа? Перебирайте только нечетные np.arange(1, number, 2), а двойку учитывайте отдельно. Вот уже экономия памяти и времени работы в 2 раза. Также можно исключить из простых чисел числа, заканчивающиеся на 5 (кроме самой 5-ки).

Добавлено через 21 минуту
https://stackoverflow.com/ques... 88#3035188
Очень быстрое нахождение простых чисел в диапазоне. 57 ms для 10 000 000.
2
0 / 0 / 0
Регистрация: 12.02.2015
Сообщений: 44
26.02.2021, 16:28  [ТС]
u235, спасибо огромное за ответ!

По теме с простыми числами - понял, да, очень хорошие примеры. Спасибо. Но я хотел бы еще разобраться со Spark'ом. Почему он в этом случае адекватно не применяется и в каких тогда BigData случаях его применить удобно (желательно в IDE Jupyter). Или может код Спарка здесь как-то по-другому написать. Не знаю в общем, ум раскорячился. В Интернете есть примеры его применения, но какие-то нелепые - типа массива из 4 ячеек. Но так это и обычными способами можно сделать, без Спарка. А хотелось бы именно вот такой крутой результат получить - типа массив 100 миллионов ячеек обработался за минуту.

Добавлено через 2 часа 0 минут
u235, прошу прощения, а Вы не могли бы подсказать по теме Спарка? :-)
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
26.02.2021, 16:33
vitenka95, нет, не приходилось пользоваться..
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
30.03.2021, 12:05
Цитата Сообщение от vitenka95 Посмотреть сообщение
Почему он в этом случае адекватно не применяется
Spark для распределенных вычислений.
Просто загугли что это и подумай какое отношение твой ноут имеет к ним.

Добавлено через 26 минут
Цитата Сообщение от vitenka95 Посмотреть сообщение
Соответственно, count в моем массиве с уже отобранным кол-вом True значений тоже вроде как не должен выполняться слишком долго
...
MapReduce – это всегда полное сканирование данных, никаких индексов нет. Это означает, что MapReduce плохо применим, когда ответ требуется очень быстро.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
31.03.2021, 12:11
Лучший ответ Сообщение было отмечено vitenka95 как решение

Решение

vitenka95, spark - для удобного раскидывания между компьютерами по сети. У вас заюзано много компьютеров, чтобы имело смысл его использовать?

Тело функции имеет значение. Сдаётся мне, вы каждое число вычисляете отдельно. Используйте решето Эратосфена. И без всякого распараллеливания взлетит.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.03.2021, 12:11
Помогаю со студенческими работами здесь

Как работать с типом enum?
Подскажите по типу enum, как с ним работать. Что означает к примеру: enum {privet, poka, molodes}; и enum TSova {csNormal,...

Как работать с типом Char
суть такова. Есть тип Char, он занимает один байт = 8 бит, так вот, нужно обращаться к каждому биту этого Char.

Как работать с типом 8204?
Скрипт исполняющийся под системой визуализации АСУ ТП Iconics Genesis 7.1 ScriptWorX имеет следующий вид: Dim elp As Variant Dim sc As...

Как правильно следует ввести массив и работать с его элементами через указатель?
Дан массив вещественных чисел, состоящий из N элементов (N=20). Найти количество элементов между его максимальным и минимальным...

Как работать с типом string в цикле на С++
Доброго времени суток, и с Наступающим всех! Вопрос в том, как реализовать 21-ую строку, чтобы при вводе "Да" я мог...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru