Вы понимаете, что ваши размеры огромны?
Размер составляет примерно 3 с половиной года (в днях) = 1277, умноженный на 99 магазинов = 126 423, умноженный на 8999 товаров = 1 137 680 577 строк.
Если вам нужно в среднем 16 байтов (что уже немного), вам нужно как минимум 17 ГБ памяти для этого!
По этой причине Store_IDs
и Product_IDs
должны действительно быть просто маленькими целыми числами, как индекс в таблице с более описательными именами.
Способ повысить эффективность - уменьшить количество вызовов функций! Например, вы можете использовать numpy
генерацию случайных чисел для генерации случайных значений в совокупности.
Предполагая, что все используемые числа могут уместиться в 16 бит, вот одно решение вашей проблемы (все еще требующее много памяти):
import pandas as pd
import numpy as np
def gen_data(datelist, store_IDs, product_IDs):
date16 = np.arange(len(datelist), dtype=np.int16)
store16 = np.arange(len(store_IDs), dtype=np.int16)
product16 = np.arange(len(product_IDs), dtype=np.int16)
A = np.array(np.meshgrid(date16, store16, product16), dtype=np.int16).reshape(3,-1)
length = A.shape[1]
sales = np.random.randint(100, 1001, size=(1,length), dtype=np.int16)
sold = np.random.randint(1, 101, size=(1,length), dtype=np.int16)
data = np.concatenate((A,sales,sold), axis=0)
df = pd.DataFrame(data.T, columns=['Date index', 'Store ID index', 'Product ID index', 'Sales', 'Number of Products Sold'], dtype=np.int16)
return df
FWIW на моей машине я получаю:
Date Store ID Product ID Sales Number of Products Sold
0 0 0 0 127 85
1 0 0 1 292 37
2 0 0 2 180 36
3 0 0 3 558 88
4 0 0 4 519 79
... ... ... ... ... ...
1137680572 1276 98 8994 932 78
1137680573 1276 98 8995 401 47
1137680574 1276 98 8996 840 77
1137680575 1276 98 8997 717 91
1137680576 1276 98 8998 632 24
[1137680577 rows x 5 columns]
real 1m16.325s
user 0m22.086s
sys 0m25.800s
(у меня недостаточно памяти и я использую swap)