Как устранить ошибку ядра или ошибку памяти? - PullRequest
0 голосов
/ 01 марта 2019

У меня был и массив строк, длина которых 50000. Я пытаюсь создать матрицу подобия измерения 50000 * 500000. Чтобы сделать это, я попытался сформировать список кортежей, используя следующий код:

terms = [element for element in itertools.product(array1,array1)]

Но я получаю ошибку памяти или ошибку ядра.Он не мог двигаться вперед.

Я также следовал за этим вопросом при переполнении стека: Spark Уникальная пара в декартовом произведении Это очень похоже на мою реализацию вычисления расстояний (из-за симметрии я могу использовать верхнюю илинижний треугольник в матрице).Есть ли способ сделать это с помощью искры или любых других способов работы с разделами или другими способами.Любая идея будет оценена.

Пример игрушки для небольшого массива:

array1 = np.array(['hello', 'world', 'thankyou'])
terms = [element for element in itertools.product(array1,array1)]

Вывод терминов:

[('hello', 'hello'),
 ('hello', 'world'),
 ('hello', 'thankyou'),
 ('world', 'hello'),
 ('world', 'world'),
 ('world', 'thankyou'),
 ('thankyou', 'hello'),
 ('thankyou', 'world'),
 ('thankyou', 'thankyou')]

1 Ответ

0 голосов
/ 01 марта 2019

50000 * 50000 - это 2 ГБ + элементов в списке.Каждый элемент списка занимает 4 байта (+36 байтов для заголовка списка).Умножьте это на среднюю длину строки (6 в вашем примере) + 21 (количество байтов на строку).Это означает, что вам понадобится более 216 ГБ ОЗУ только для этого отдельного оператора (это в верхней части памяти для вашей ОС, других программ и т. Д.).Я думаю, что вы попали в реальные ограничения и вам нужно найти лучшие алгоритмы.

...