Итерация и объединение 2 списков занимают огромную память - PullRequest
1 голос
/ 15 марта 2019

В Python 3 я пытаюсь сгенерировать последовательность в этом формате из 4 списков

<yyyymmdd>-<1-200>-<1-20>-<1-13000>

20161201-1-1-1
20161201-1-1-2
20161201-1-1-3
..
..
20161201-1-2-1
20161201-1-2-2
..
..
20161201-2-1-1
20161201-2-1-2
..
20161202-1-1-1
20161202-1-1-2
..
..
20190701-200-20-13000

первый список находится в диапазоне дат <yyyymmdd to yyyymmdd>, остальные 3 списка находятся в диапазонах <1-200> <1-20> and <1-13000>.

Все значения списка представлены в формате str.

Теперь я пытаюсь сделать следующее:

import itertools
import pandas as pd

all_dates = [d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226')]
all_users = list(range(0,200))
all_products = list(range(0,15))
all_customers = list(range(0,13000))

date_user_product_map = []
date_user_product_customer_map = []

for pair in itertools.product(all_dates,all_users, all_products):
    date_user_product_map.append('-'.join(pair))

for pair in itertools.product(date_user_product_map,all_customers):
    date_user_product_customer_map.append('-'.join(pair))

Первая конкатенация из 3 списков выполняется быстро имало памяти.Вторая конкатенация просто занимает огромную память и уничтожается.

Я пытался запустить ее и на 48-гигабайтной системе ОЗУ, но, похоже, для ее запуска недостаточно памяти.

Мне нужна помощь в решении этой проблемы, а также понимание того, почему для этого требуется столько памяти.Что я здесь не так делаю?

ОБНОВЛЕНИЕ: (мое требование)

Итак, у меня есть пара информационных фреймов, в которых есть несколько столбцов, значения которыхв формате - <1-200> - <1-20> - <1-13000>, который занимает много места И, следовательно, я хочу создать список всех возможных значений, а затем перечислить и создать словарькак показано ниже:

- <1-200> - <1-20> - <1-13000>

20161201-1-1-1: 0 20161201-1-1-2:1 20161201-1-1-3: 2 .. .. 20190701-200-20-12999: n-1 20190701-200-20-13000: n

и затем замените значения кадров данных на 1, 2 ... n, n-1.

Есть ли другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Вам не нужно конвертировать эти диапазоны в списки.

Вы должны сделать что-то вроде этого:

import itertools
import pandas as pd

all_dates = (d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226'))
all_users = range(0,200)
all_products = range(0,15)
all_customers = range(0,13000)

date_user_product_pairs = ( '-'.join(pair) for pair in itertools.product(all_dates,all_users, all_products))

date_user_product_customer_pairs = ( '-'.join(pair) for pair in itertools.product(date_user_product_map,all_customers))

, тогда вы можете использовать эти генераторы пар, чтобы получить то, что вам нужно.

1 голос
/ 15 марта 2019

Просто используйте одно выражение генератора:

sequences = ('-'.join(str(x) for x in p) for p in itertools.product(all_dates,all_users,all_products, all_customers))

Используется как:

>>> for _ in range(10): print(next(sequences))

20160119-0-0-0
20160119-0-0-1
20160119-0-0-2
20160119-0-0-3
20160119-0-0-4
20160119-0-0-5
20160119-0-0-6
20160119-0-0-7
20160119-0-0-8
20160119-0-0-9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...