2017-01-10 1 views
-3

Я работаю над задачей программирования, связанной с быстрой обработкой и большими данными. Я пытаюсь создать список возможных перестановок диапазона чисел, а затем выполнить поиск по ним.Список, занимающий 13 концертов барана с 127 mil записей: как?

Код:

def generate_list(numA, numB): 
    combo = list(range(0, numB)) 
    permutation_list = list(itertools.permutations(combo, numA)) 
    print("initial dictionary length: " + len(permutation_list)) 

Проблема заключается в том, что когда А 6 и В 25, моя программа замедляет очень и занимает огромное количество оперативной памяти. Он заглянул на 13 концертов. Длина списка составляет около 127 мил, а каждый объект имеет длину 6. Это должно использовать около 750 мегабайт памяти, а не 13 концертов. Что происходит?

Редактировать: Данные просто цифры. Таким образом, [[0,1,2,3,4,5], [0,1,2,3,4,6], ...]

+0

Какая проблема? Любой доступ к описанию и данным? – ppasler

+0

Данные - это просто цифры. Итак, [[0,1,2,3,4,5], [0,1,2,3,4,6], ...] – Smipims

+0

Я сделал ошибку. Я имел в виду список везде, где я ввел словарь – Smipims

ответ

2

Каждый элемент списка или кортежа является указателем. И имеет размер 4 или 8 байт. Следующее предполагает последнее. Просто подсчет указателей в списке и кортежей составляет половину используемого пространства. Остальное - это, вероятно, заголовок объекта, который составляет около 48 байт. Это дает формулу:

(48+8+(8*6)) * 127000000 == 13208000000 

, который относится к вашим 13 гигабайтам.

Я предлагаю сделать все возможное, чтобы избежать создания полной перестановки.

+0

Спасибо! Я решил, что должен был сделать это по-другому, но всегда хорошо знать, почему я терпел неудачу, а не только то, что я потерпел неудачу. – Smipims

-1

Пример того, как можно вывести весь список перестановок может быть следующим:

import itertools 

def combo(b): 
    for combination in range(0, b): 
     yield combination 

def generate_list(numA, numB): 
    for l in itertools.permutations(combo(numB), numA): 
     yield list(l), len(l) 

if __name__ == '__main__': 
    total_length = int() 
    with open('permutations', 'w+') as f: 
     f.write('[') 
     for permutation in generate_list(6, 25): 
      data, length = permutation 
      total_length += length 
      f.write(str(data) + ', ') 
     f.write(']\n') 
    print("initial dictionary length: " + str(total_length)) 

Я повернул свой код в два отдельных генераторов. Один, который дает комбинацию, другой, который дает перестановку.

Вы можете вычислить всю вещь без MemoryError и записать их в файл. A очень большой файл. Или вы можете просто распечатать его на stdout, вплоть до вас.

Он также расскажет вам длину в конце, не требуя огромного количества памяти для этого.

Смежные вопросы